使用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接口,而是在原来的基础上封装一层通用代码,单表继承我们的通用代码,实现 ...
随机推荐
- vue 动画过渡
一.过渡(动画) 1. 简介 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果,本质上还是使用CSS3动画:transition.animation 2. 基本用法 1.使用t ...
- Linux-chmod_命令的详细用法讲解
Linux chmod 命令 chmod用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限.该命令有两种用法.一种是包含 字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. 1 ...
- Uvalive 7037 The Problem Needs 3D Arrays(最大密度子图)
题意:给一段子序列,定义密度:子序列中的逆序对数/子序列的长度 求这个序列的对大密度. 分析:将序列中的每个位置视作点,逆序对\(<i,j>\)之间表示点i与点j之间有一条无向边.所以就转 ...
- [Python]返回函数,装饰器拾遗
def lazy_print(*args): def pr(): print(args) return pr 当我们调用lazy_print()时,返回的并不是求和结果,而是求和函数: >> ...
- LRU算法---缓存淘汰算法
计算机中的缓存大小是有限的,如果对所有数据都缓存,肯定是不现实的,所以需要有一种淘汰机制,用于将一些暂时没有用的数据给淘汰掉,以换入新鲜的数据进来,这样可以提高缓存的命中率,减少磁盘访问的次数. LR ...
- QUIC协议
QUIC协议 QUIC协议参考网址 https://www.chromium.org/quic 既生瑜,何生亮? QUIC的特性 提供可靠传输 减少连接建立的时间 改善拥塞控制 多路复用 转发错误连接 ...
- iOS & Android APP crash保护机制
一.背景 还在码代码,码好再BB... 二.思路 三.解决方案 四.注意点 五.开源项目 github:https://github.com/qiyer/QYCrashProtector
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
转自:https://www.cnblogs.com/qinfengxiaoyue/archive/2013/02/04/2891908.html 函数在C++编译方式与C编译方式下的主要不同在于:由 ...
- Python3.x:代理ip刷评分
Python3.x:代理ip刷评分 声明:仅供为学习材料,不允许用作商业用途: 一,功能: 针对某网站对企业自动刷评分: 网站:https://best.zhaopin.com/ 二,步骤: 1,获取 ...
- hive 相关异常
内存不够: set mapreduce.map.memory.mb=4096;set mapreduce.map.java.opts=-Xmx3280m; set mapreduce.reduce.m ...