使用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[2].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(0, 1);
            name = name.Substring(1, name.Length - 1);
            name = first.ToUpper() + name;

            int index = name.IndexOf("_");
            while (index != -1)
            {
                if (name.Length >= index + 2)
                {
                    first = name.Substring(index + 1, 1);
                    string start = name.Substring(0, index);
                    string end = name.Substring(index + 2, name.Length - index - 2);
                    name = start + first.ToUpper() + end;

                    index = name.IndexOf("_");
                }
            }

            name = name.Replace("_", "");

            return name;
        }
    }
}

完成上面代码,这个工具的核心功能基本就完成了。

源码下载地址:点击下载

使用Easy4net编写代码生成器,布布扣,bubuko.com

时间: 2024-12-08 01:58:08

使用Easy4net编写代码生成器的相关文章

金笛短信中间件Web版本和研发信息发布

金笛短信中间件VC版经过8年的不断完善,一直在客户中拥有良好的口碑.随着产品用户群日益扩大, 更多客户提出基于WEB收发.管理的需求. 金笛短信中间件Web版从金笛JAVA开发包发展而来,历时V3.1,V3.2,V3.3, V3.4, V3.5各个版本,不觉已经5个春秋. 在这个春日盎然.煦日洋溢的日子里,金笛短信中间件Web版V3.6.1隆重发布了!新版本有更多激动人心的功能.这个版本在推出之前,已经经过长时间的测试与完善,经过多年的技术积累和沉淀,相信这个版本的稳定性和智能化会给您留下印象.

使用maven的mybatis-generator代码生成器插件生成实体类、mapper配置文件和mapper接口(使用idea)

接着之前创建的ssmMaven项目 一: 在pom文件中加入mybatis-generator插件 <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuratio

计算机硬件架构五

M68000, M68K:这个摩托罗拉68000系列(也被称为680x0,M68000,m68k,或68k)是一个家庭32 复杂指令集计算机(CISC)微处理器.在80年代和90年代初,他们很受欢迎个人电脑和工作站和是主要的竞争对手因特尔的x86微处理器.他们最著名的处理器供电的早熟苹果Macintosh,司令官Amiga,的辛克莱QL,的雅达利ST,的Weatherstar,的世嘉五代(Mega Drive),和其他几个人.虽然没有现代台式电脑是基于68000系列处理器,处理器仍然广泛使用的衍

使用 CodeIgniter 框架快速开发 PHP 应用(一)

原文:使用 CodeIgniter 框架快速开发 PHP 应用(一) 对 CodeIgniter 的介绍 大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事.这篇文章是有关 CodeIgniter的(以后简称CI),CI是一个达成上面目的的所谓框架. 如果你只是要达成一个最终的结果,而把中间所有的编码细节和复杂统统丢给一个框架,CI是你最好的朋友. CI有很多优点:免费, 轻量级, 容易安装, 它能使你的编程生涯变得很轻松. 这一章我们会告诉你: . CI 能为你做什

Mybatis-Plus的填坑之路 - Lynwood/wunian7yulian

html { } :root { } html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif } body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0p

使用Springboot + Gradle快速整合Mybatis-Plus

作者:Stanley 罗昊 QQ:1164110146 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 注:作者使用IDEA编辑器 使用 Spring Initializr 快速初始化一个 Spring Boot 工程 在IDEA编辑左上角Flie ->new - >Project ?? 选择Spring Initializr -->Next:(下一步)进入下面这个界面??,Group:填

使用C#编写自己的代码生成器,附代码讲解(一)

使用过代码生成器的开发人员应该知道,通过代码生成器生成项目的代码,可以大大的减少重复编码的时间,提供项目开发的效率,将自己从繁杂重复的代码中解放出来.现在网络上也有很多的开源的代码生成器或者使用比较广泛的代码生成器,如动软代码生成器相信不少开发人员使用过.有时候在线的代码生成器生成的代码未必百分之百符合我们的心意,符合项目的需要,此时我们可以考虑自己使用C#编写一套自己的代码生成器软件,可以按照自己指定的规则生成相应的代码文件以及目录.博主在工作过程中接触以及开发过2类代码生成器,一类是WinF

自己编写的DAL三层代码生成器

(1)创建自己的解决方案 目录结构如下: (2)编写代码: (要使用数据库 建议创建任意数据库即可) 创建配置文件App.config代码如下: <?xml version="1.0"?> <configuration> <connectionStrings> <add name="connstr" connectionString="Data Source=.; Initial Catalog=HRMSYSDB;

论动软代码生成器的好与坏

曾几何时,动软代码生成器是一种非常方便的工具,很多从事C#语言的开发人员都用过这个工具,当然也包括楼主本人. 以往的开发模式都是围绕数据库为中心展开的,先设计好数据库,然后再编写代码.动软代码生成器就是在这样的背景下诞生的. 你只要设计好数据库模式,然后用动软代码生成器一键生成数据访问层代码,非常方便.(虽然动软有业务层,但我认为那是鸡肋,只不过是数据访问层的一层简单包装,没有实际意义) 这对不想手动编写枯燥乏味的数据库操作的开发人员来说,非常有吸引力. 下面楼主凭借自己的经验,从好与坏两个方面