使用Easy4net编写代码生成器
在项目中经常要手动创建和数据库对应的实体类,如果数据库表比较多或者表字段比较多,那会是一个工作量非常大的事情,所以我根据自己的需求写了一个简单的代码生成工具,工具使用Easy4net框架开发。

下面是代码目录结构:

项目开始预备步骤:
1. 创建项目EntityCodeBuilder
2. 引入Easy4net项目源码
3. 创建Entity类库
4. 创建TableName和TableColumn类
5. 在App.config配置文件中配置数据库连接信息
TableName源码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace EntityCodeBuilder.Entity
{
public class TableName
{
public string Name { get; set; }
}
}
TableColumn源码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace EntityCodeBuilder.Entity
{
public class TableColumn
{
public string Name { get; set; }
public string Type { get; set; }
public string IsIdentity { get; set; }
public string IsPrimaryKey { get; set; }
public string IsNull { get; set; } }
}
App.config配置文件代码:
<appSettings>
<add key="DbType" value="sqlserver"/>
<add key="connectionString" value="Data Source=.;Initial Catalog=test;User ID=test;Password=test123;Trusted_Connection=no;Min Pool Size=10;Max Pool Size=100;"/> <!--<add key="DbType" value="mysql"/>
<add key="connectionString" value="Data Source=.;port=8001;User ID=test;Password=123456;DataBase=test;Min Pool Size=10;Max Pool Size=100;"/>--> </appSettings>
UI上的代码不细说了,主要是有几个类的代码:
TableHelper中的代码,获取数据库所有表名:
/// <summary>
/// 获取数据库所有表名
/// </summary>
/// <param name="connection"></param>
/// <returns></returns>
public static List<TableName> GetTables()
{
SqlConnection connection = (SqlConnection)DbFactory.CreateDbConnection(AdoHelper.ConnectionString);
List<TableName> tablelist = new List<TableName>();
try
{
if (connection.State == ConnectionState.Closed)
{
connection.Open();
DataTable objTable = connection.GetSchema("Tables");
foreach (DataRow row in objTable.Rows)
{
TableName tb = new TableName();
tb.Name = row[].ToString();
tablelist.Add(tb);
}
}
}
catch(Exception e)
{
throw e;
}
finally
{
if (connection != null && connection.State == ConnectionState.Closed)
{
connection.Dispose();
}
} return tablelist;
}
TableHelper中的代码,根据表名获取所有列:
/// <summary>
/// 获取字段
/// </summary>
/// <param name="connection"></param>
/// <param name="TableName"></param>
/// <returns></returns>
public static List<TableColumn> GetColumnField(string TableName)
{
StringBuilder sb = new StringBuilder();
sb.Append(" SELECT a.name,");
sb.Append(" b.name as type,");
sb.Append(" CASE COLUMNPROPERTY(a.id,a.name,'IsIdentity') WHEN 1 THEN '√' ELSE '' END as IsIdentity, ");
sb.Append(" CASE WHEN EXISTS ( SELECT * FROM sysobjects WHERE xtype='PK' AND name IN ( SELECT name FROM sysindexes WHERE id=a.id AND indid IN ( SELECT indid FROM sysindexkeys ");
sb.Append(" WHERE id=a.id AND colid IN ( SELECT colid FROM syscolumns WHERE id=a.id AND name=a.name ) ) ) ) THEN '√' ELSE '' END as IsPrimaryKey,");
sb.Append(" CASE a.isnullable WHEN 1 THEN '√' ELSE '' END as IsNull ");
sb.Append(" FROM syscolumns a ");
sb.Append(" LEFT JOIN systypes b ON a.xtype=b.xusertype ");
sb.Append(" INNER JOIN sysobjects c ON a.id=c.id AND c.xtype='U' AND c.name<>'dtproperties' ");
sb.Append(" LEFT JOIN syscomments d ON a.cdefault=d.id ");
sb.Append(" WHERE c.name = '").Append(TableName).Append("' ");
sb.Append(" ORDER BY c.name, a.colorder"); //使用Easy4net框架查询数据
List<TableColumn> list = db.FindBySql<TableColumn>(sb.ToString());
return list;
}
知道表名,字段名称,字段类型后,要生成实体类,需要根据数据库中的数据类型转换为C#中的类型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace WindowsDemo
{
public class TypeHelper
{
public static string GetType(string type)
{
string newType = "String"; switch (type)
{
case "varchar":
case "varchar2":
case "nvarchar":
case "char":
newType = "String";
break;
case "int":
case "integer":
case "bit":
case "smallint":
newType = "int";
break;
case "long":
case "bitint":
newType = "long";
break;
case "date":
case "datetime":
case "datetime2":
case "datetimeoffset":
newType = "DateTime";
break;
case "decimal":
case "number":
case "money":
case "numeric":
newType = "Decimal";
break;
case "double":
newType = "double";
break;
case "float":
newType = "float";
break;
} return newType;
}
}
}
下面就是生成代码的具体步骤了:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using EntityCodeBuilder.Entity; namespace WindowsDemo
{
public class CreateFileHelper
{
/// <summary>
/// 创建类文件目录和文件
/// </summary>
/// <param name="tables">所有表</param>
/// <param name="fileDir">文件目录</param>
public static void Create(List<TableName> tables, string fileDir)
{
CreateDirectory(fileDir);
foreach (TableName table in tables)
{
//实体类名称
string entityName = GenVarName(table.Name);
//实体类文件名
string filePath = fileDir + entityName + ".cs";
//文件是否存在
bool exists = File.Exists(filePath); //创建文件
FileStream fs = new FileStream(filePath, exists ? FileMode.Open : FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs); //生成代码
string code = CreateFileHelper.BuilderCode(table.Name); //写入代码到文件
sw.WriteLine(code); sw.Close();
fs.Close();
}
} /// <summary>
/// 创建文件目录
/// </summary>
/// <param name="targetDir"></param>
private static void CreateDirectory(string targetDir)
{
DirectoryInfo dir = new DirectoryInfo(targetDir);
if (!dir.Exists)
dir.Create();
} /// <summary>
/// 根据表名,生成代码
/// </summary>
/// <param name="tableName">表名</param>
/// <returns></returns>
public static string BuilderCode(string tableName)
{
string entityName = GenVarName(tableName); StringBuilder sb = new StringBuilder();
sb.Append("using System;").Append("\n");
sb.Append("using System.Collections.Generic; ").Append("\n");
sb.Append("using System.Linq; ").Append("\n");
sb.Append("using System.Text; ").Append("\n");
sb.Append("using System.Text; ").Append("\n");
sb.Append("namespace Easy4net.Entity ").Append("\n");
sb.Append("{ ").Append("\n"); sb.Append("\t [Table(Name = \"").Append(tableName).Append("\")] ").Append("\n");
sb.Append("\t public class ").Append(entityName).Append("\n");
sb.Append("\t { ").Append("\n"); List<TableColumn> columns = TableHelper.GetColumnField(tableName);
foreach (TableColumn column in columns)
{
string type = TypeHelper.GetType(column.Type);
if (column.IsPrimaryKey == "√")
{
//[Id(Name = "UserID", Strategy = GenerationType.INDENTITY)]
string strategy = "GUID";
if (column.IsIdentity == "√")
{
strategy = "INDENTITY";
} sb.Append("\t\t").Append("[Id(Name = \"").Append(column.Name).Append("\", Strategy = GenerationType.").Append(strategy).Append(")]").Append("\n");
}
else
{
sb.Append("\t\t").Append("[Column(Name = \"").Append(column.Name).Append("\")]").Append("\n");
} string fieldName = GenVarName(column.Name);
sb.Append("\t\t").Append("public ").Append(type).Append(" ").Append(fieldName).Append("{ get; set; } \n\n");
} sb.Append("\t } ").Append("\n");
sb.Append("} ").Append("\n"); return sb.ToString();
} /// <summary>
/// 将数据库中变量名改为驼峰命名
/// 如 user_name 改为 UserName
/// </summary>
/// <param name="name">变量名</param>
/// <returns></returns>
public static string GenVarName(string name)
{
string first = name.Substring(, );
name = name.Substring(, name.Length - );
name = first.ToUpper() + name; int index = name.IndexOf("_");
while (index != -)
{
if (name.Length >= index + )
{
first = name.Substring(index + , );
string start = name.Substring(, index);
string end = name.Substring(index + , name.Length - index - );
name = start + first.ToUpper() + end; index = name.IndexOf("_");
}
} name = name.Replace("_", ""); return name;
}
}
}
完成上面代码,这个工具的核心功能基本就完成了。
源码下载地址:点击下载
使用Easy4net编写代码生成器的更多相关文章
- 代码生成器——实现生成pojo,sql,mapper接口
代码生成器(记录一次兴趣代码,多多指教.转载请标明作者) 在我们开始实现代码生成器之前我们先来对代码生成器有一个简单的了解. 1.什么是代码生成器? 故名思义,也就是生成代码的一个程序.那它是一个什么 ...
- 使用maven的mybatis-generator代码生成器插件生成实体类、mapper配置文件和mapper接口(使用idea)
接着之前创建的ssmMaven项目 一: 在pom文件中加入mybatis-generator插件 <plugins> <plugin> <groupId>org. ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(一)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(一) 对 CodeIgniter 的介绍大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事.这篇文章是有关 ...
- Mybatis-Plus的填坑之路 - Lynwood/wunian7yulian
目录 Mybatis-Plus 我来填坑~ 目录 一.简单介绍 官方说明 : 成绩: 最新版本: 开发层面MyBatis-Plus特色 Mybatis-Plus中的Plus 二.MP的特性 三.MP框 ...
- SpringBoot15 sell01 项目创建、MySQL数据库连接、日志配置、开发热部署、商品信息模块
项目软件版本说明: jdk: 1.8 springboot: 2.0.1 mysql: 5.7 1 项目创建 创建一个SpringBoot项目即可,创建是勾选 web jpa mysql 这三个依赖就 ...
- SpringBoot | 第九章:Mybatis-plus的集成和使用
前言 本章节开始介绍数据访问方面的相关知识点.对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的.目前,绝大部分公司都选择MyBatis框架作为底层数据库持久化框 ...
- [Google Guava] 6-字符串处理:分割,连接,填充
原文链接 译文链接 译者:沈义扬,校对:丁一 连接器[Joiner] 用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦.如果字符串序列中含有null,那连接操作会更难.Fluent风格的Joine ...
- 一起了解 .Net Foundation 项目 No.5
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Couchbase Lit ...
- SpringBoot系列——MyBatis-Plus整合封装
前言 MyBatis-Plus是一款MyBatis的增强工具(简称MP),为简化开发.提高效率,但我们并没有直接使用MP的CRUD接口,而是在原来的基础上封装一层通用代码,单表继承我们的通用代码,实现 ...
随机推荐
- sql中表级约束和列级约束
sql中表级约束和列级约束,在SQL SERVER中, (1) 对于基本表的约束分为列约束和表约束约束是限制用户输入到表中的数据的值的范围,一般分为列级约束与表级约束.列级约束有六种:主键Primar ...
- C++实现去掉string字符串前后的空白字符
C++标准库提供的字符串类string没有提供类似CString中Trim方法,该方法功能为去除字符串前后的空白字符.利用string自身一些方法可以很容易实现该功能. 如下: void Trim(s ...
- 基于docker的gitlab+gitlabrunner+ansible自动部署
系统架构图 网络架构 一.安装docker,确保hostname没有问题 ,查看/etc/hostname./etc/hosts. https://docs.docker.com/engine/ins ...
- 1.MySQL必知必会之数据库基础
下面这几个是几个关于数据库的关键字的概念,为后面的教程做基础的: 数据库:保存有组织的数据的容器(通常是一个文件或一组文件). 表: 某种特定类型数据的结构化清单. 模式:关于数据库和表的布局 ...
- OpenStack的架构详解
OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云.小云提供可扩展的.灵活的 ...
- Windows资源监控神器——perfmon
一.简述 笔者在用lr中control监控Windows资源的时候,有时候总是遇到卡死和报错,所以就发现了Windows自带的监控神器————perfmon. Perfmon提供了图表化的系统性能实时 ...
- Android系统init进程启动及init.rc全解析
转:https://blog.csdn.net/zhonglunshun/article/details/78615980 服务启动机制system/core/init/init.c文件main函数中 ...
- 【Python】模块
廖雪峰教程笔记. [使用模块有什么好处?] 1.使用模块可以避免函数名和变量名冲突. 2.大大提高了代码的可维护性. [使用模块的注意点] 1.每一个.py文件就是一个模块. 2.每一个包目录下面必须 ...
- Yahoo网站性能优化的34条规则
摘自:http://blog.chinaunix.net/uid/20714478/cid-74195-list-1.html Yahoo网站性能优化的34条规则 1.尽量减少HTTP请求次数 终端用 ...
- [HAOI2017模拟]百步穿杨
今天的考试题. 考试的时候因为以前做过还写过题解,然后就以为模型已经很清楚了,然后就开始直接推.最后因为蜜汁自信一定能推出来,然后模型搞错了,只能交个暴力上去,于是这场考试GG. 第一次碰上这道题是在 ...