使用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加载完成之后实现实例化 eg: window.onload = function(){ new Vue({ el: '#editor', data: { input: '# he ...
- python全栈开发从入门到放弃之面向对象的三大特性
组合 class Course: def __init__(self,name,period,price): self.name = name self.period = period self.pr ...
- (C++) Assertion failed: !"Bad error code", file VMem.c, line 715
(C++) Assertion failed: !"Bad error code", file VMem.c, line 715 Misc error. myInterface F ...
- java初学一
1.区分大小写 public static void main String args[] 是类体中的一个方法,之后的两个大括号以及之间的内容叫做方法体,一个java应用程序中必须有一个类且只有一个 ...
- 42. Trapping Rain Water(直方图 存水量 hard)
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- Windows 配置安卓环境变量
变量名:JAVA_HOME 变量值:JDK 路径 变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\toos.jar // ...
- [CLR via C#读后整理]-1.CLR的执行模型
公共语言运行时(Common Language Runtime,CLR)是一个可由多种编程语言使用的"运行时".他主要提供的功能有:程序集加载,内存管理,,安全性,异常处理,线程同 ...
- 337APuzzles
dangerous /*大水题目.不解释 给你m个数,从中选出n个,保证最大值和最小值的差值最小, 做法:从小到大排序,然后暴力枚举每个长度是n的序列*/ #include<stdio.h> ...
- windows安装git客户端
1:线上git地址 https://github.com/ 2:tortoiseGit地址 http://tortoisegit.org 3:安装步骤 操作系统:Windows XP SP3 Git客 ...
- Web安全学习笔记之Nmap脚本编写
0x00 Nmap脚本简介 夜无眠,看了一下Nmap官方的英文API文档(全是English),瞬间心态崩塌,不想吐槽它们的nmap官网前端太丑了=.=,但是都是大牛啊,挺敬佩开源开发者的. Nmap ...