写代码生成器

今天突然想写个代码生成器。

写一个代码生成器最主要的是,①需要获取库下面所有的表 ②获取表中所有的字段,注释,类型 ③前2者具备就可以写个代码生成器

一:先上个简单的界面

二:操作数据方法

  public class GetDataTest
    {
        /// <summary>
        /// 操作数据库方法
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <returns></returns>
        public static MySqlDataReader GetData(string sql)
        {
            try
            {
                var connection = ConfigurationManager.ConnectionStrings["mysql"].ConnectionString;
                MySqlConnection con = new MySqlConnection(connection);
                if (con.State == ConnectionState.Closed) con.Open();
                using (MySqlCommand cmd = new MySqlCommand(sql, con))
                {
                    con.Open();
                    cmd.CommandType = CommandType.Text;
                    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
            }
            catch (Exception)
            {
                return null;
            }
        }
    }

三:获取所有表

var sql = "select TABLE_NAME from information_schema.tables where TABLE_SCHEMA=‘库名‘";
                using (var read = GetDataTest.GetData(sql))
                {
                    if (read.HasRows)
                    {
                        while (read.Read())
                        {                            //循环获取表明
                            object k = read.GetValue(0);
                        }
                    }
                }

四:获取表中的字段,注释,类型

var sql = "select COLUMN_NAME,column_comment, DATA_TYPE from information_schema.COLUMNS where table_name =‘表名‘";
                using (var read = GetDataTest.GetData(sql))
                {
                    if (read.HasRows)
                    {
                        while (read.Read())
                        {
                            //根据sql查询字段的顺序排列,COLUMN_NAME,column_comment, DATA_TYPE
                            //字段名
                            var field = read.GetValue(0);
                            //字段注释
                            var comment = read.GetValue(1);
                            //字段类型
                            var type = read.GetValue(2).ToString();
                        }
                    }
                }

拼接model类的例子

  /// <summary>
        /// 生成代码的方法
        /// </summary>
        /// <param name="projectName">项目名称</param>
        /// <param name="tableName">表名称</param>
        /// <param name="arg">参数</param>
        public override object Make(string projectName, string tableName, dynamic arg)
        {
            try
            {

//拼接Model类
                StringBuilder sbm = new StringBuilder();
                sbm.AppendLine("using System;");
                sbm.AppendLine("using System.Text;");
                sbm.AppendLine($"namespace {projectName}.Model");
                sbm.AppendLine("{");
                sbm.AppendLine($"public  class {tableName}Model");
                sbm.AppendLine("{");

                var reader = (MySqlDataReader)arg;
                while (reader.Read())
                {
                    //一个字段有个属性
                    var count = reader.FieldCount;
                    if (count <= 0) continue;
                    //字段名
                    var field = reader.GetValue(0);
                    //字段注释
                    var comment = reader.GetValue(1);
                    //字段类型
                    var type = reader.GetValue(2).ToString();
                    sbm.AppendLine("/// <summary>");
                    sbm.AppendLine($"/// {comment}");
                    sbm.AppendLine("/// <summary>");
                    sbm.AppendLine($"public {type.Switch()} {field}" + "{ get; set; }");
                }
                sbm.AppendLine("}");
                sbm.AppendLine("}");
                return sbm;
            }
            catch (Exception)
            {
                return null;
            }
        }
         //1.生成model数据
                MakeCode mm = new MakeModel();
                var content = mm.Make(projectName, tableName, item);
                var path = AppDomain.CurrentDomain.BaseDirectory + "../../CodeFile/";
                var modelPath = path + $"Model/{tableName}Model.cs";
                mf.Create(modelPath, null, content);

生成文件

public class MakeFile : CreateFile
    {
        /// <summary>
        /// 创建文件
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="tableName">表名</param>
        /// <param name="content">生成内容</param>
        public override void Create(string path, string tableName, object content)
        {
            try
            {
                //如果存在文件就删除
                if (File.Exists(path))
                {
                    File.Delete(path);
                }
                File.Create(path).Close();
                StringBuilder sb = (StringBuilder)content;

                File.WriteAllText(path, sb.ToString());
                sb?.Clear();
            }
            catch (Exception ex)
            {

                throw;
            }
        }
    }

分享链接 密码:uhzr

时间: 2024-12-22 18:48:05

写代码生成器的相关文章

使用模板引擎(Nvelocity)写代码生成器

之前做了一个项目,由于数据库表比较多,每次都手写model,还有数据库操作之类的东西,感觉浪费时间,也没技术含量,还容易出错,最主要的原因还是懒,不想翻来覆去的写这种代码,于是想到要用代码生成器直接生成,在网上找到很多,但是生成的代码要么看着不安逸,毕竟每个人的风格不同,要么就是生成很多自己根本不需要的垃圾代码,正好最近闲来无事,决定自己动手写一个. 一开始我是想到使用stringbuilder拼接字符串来实现,但是字符串拼接起来相当麻烦,代码量也很多,看起乱糟糟的很不舒服,还有就是得注意格式,

分享一个几年前写的代码生成器

该界面设计部分来自网络.版权归原作者所有. 该工具没有做完成.我只是学习用的.主要是为了熟悉Devexress控件的使用. 1系统主界面 2系统代码生成 3生成的详细代码查看 4该工具写的不是很智能. 如下生成WCF服务契约代码: 1 public class CreateWcfService 2 { 3 4 public static string GreateWcFserviceContract(List<Model> list) 5 { 6 var strsb = new StringB

如鹏网.Net三层架构 第四章代码生成器

介绍商业及代码生成器,如何自己手写代码生成器 SELECT * from information_schema.`TABLES` WHERE TABLE_TYPE='base Table' and `ENGINE`='InnoDb' and TABLE_SCHEMA='rpcaterdb' SELECT * from information_schema.`COLUMNS` where TABLE_NAME='t_orders' 1. 完全手写采用三层架构(不借助于代码生成器)编写一个学生的增删

我要带徒弟学JAVA架构 ( 写架构,非用架构 )

我要带徒弟学JAVA架构 (写架构.非用架构) 非常多人做java开发2,3年后.都会感觉自己遇到瓶颈. 什么都会又什么都不会.怎样改变困境,为什么非常多人写了7,8年还是一个码农,工作中太多被动是由于不懂底层原理. 公司的工作节奏又比較快,难有机会学习架构原理,也没人教.所以这个时候,学习架构原理,扩展思维,对自己以后职业生涯尤为重要. 相同公司的两个新人,一个新人一点就通.学东西非常快,有的人.学东西非常慢,也非常痛苦,处处都是新技术.为什么?由于那个人懂原理,万物都有规律,掌握了规律学其它

程序员的自我救赎---1.2:代码生成器的使用

<前言> <目录> (一) Winner2.0 框架基础分析 (二) 短信中心 (三)SSO单点登录 (四)PLSQL报表系统 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八)监控系统 (九)会员中心 (十)消息中心 (十一)Winner前端框架与RPC接口规范讲解 (十二)上层应用案例 (十三)番外篇 <代码生成器的使用> 今天中午阿杰聊了会,阿杰说看了我写的博客后.发现一个问题,把Winner框架整理成文档,要把Winner框架的核心思想 给写出来,比如

Sql中获取表结构(字段名称,类型,长度,说明)

在写代码生成器的时候遇到这样一个问题,想在搭建好数据库后把字段说明当做注释写进类文件里,所以我们在网上搜索到了许多代码很长很长的方法(当然我的代码也很长),亲测了一条简单易懂的语句,也是大多数转载的方法: SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Description = ex.value, ColumnType=t.name, Length=c.max_length FROM sys.columns

说说Golang的使用心得

13年上半年接触了Golang,对Golang十分喜爱.现在是2015年,离春节还有几天,从开始学习到现在的一年半时间里,前前后后也用Golang写了些代码,其中包括业余时间的,也有产品项目中的.一直有想法写点Golang相关的总结或者感想,决定还是在年前总结下吧.注明下:我只是Golang的喜好者,不是脑残粉,也无意去挑起什么语言之争. 特性少,语法简单.GO是崇尚极简主义的,提倡少即是多.这点在它的Spec上尤其凸显,一下午的时间绝对可以看完.GO的特性很少,很多GO的使用者都反馈,GO的关

接触LLBL Gen Pro 对象关系映射框架后 前途变的一片光明

时间回到2010年,那时候还是熟悉代码生成+基础框架这种模式,基本的开发思路是通过代码生成器生成实体,再生成接口与实现类,最后拖拉控件,写界面数据绑定代码.基本上就是动软代码生成器给出的模式,或是微软的Repository Factory模式的实践,迷恋于微软的Enterprise Libray,这个框架是从Application Block演化而来.我也是算是.NET技术推广以来,第一批学习.NET技术的开发人员. 一直在寻找一种界面与逻辑分离的技术,也没有思路,上面代码生成造成的结果是逻辑代

工作流性能优化(敢问activiti有扩展性?)(3)

2015/4/20 周末回去想了下,hibernate.mybatis.jdbc,都行,最终定了用mybatis,谁叫它这么优雅,acvtiviti是依赖了mybatis的,就不用再引入包了: 看了配置文件,之前配置的是jpa,再配置mybatis,配置文件就显得臃肿,很乱了:用jpa吧,貌似也不赖: 再写一个Repository: 写SQL的时候用到了,知识点: instr:instr(t.DESCRIPTION_, 'conditionCountersign') > 0 mysql查询最后一