admin管理员组文章数量:1794759
代码生成器原理
代码生成器原理很简单,用一句话概括就是:将数据库字段转换成Java字段并输出内容。
如下图所示:
因此,首先需要做的是获取表信以及表的字段信,一般有两种方式,第一种:连接到数据库,执行相关SQL,查询出表结构信。第二种:解析DDL,得到相关信,code-gen采用第一种做法。
- 获取表信
包括表名称,表备注,Mysql可以使用下面这个SQL。(code-gen源码对应:com.gitee.gen.gen.mysql.MySqlTableSelector)
SHOW TABLE STATUS FROM table_name如果需要指定某张表,直接加where条件即可
SHOW TABLE STATUS FROM table_name where name = 'user_info';查询后结果如下:
“user_info” | “InnoDB” | “10” | “Dynamic” | “0” | “0” | “16384” | “0” | “0” | “0” | “1” | “2020-12-22 15:16:40” | “utf8_general_ci” | “用户信表” |
- 获取表字段信
Mysql可以用如下SQL(code-gen对应源码:com.gitee.gen.gen.mysql.MySqlColumnSelector):
SHOW FULL COLUMNS FROM user_info;查询后结果如下:
“id” | “int(11)” | “NO” | “PRI” | “auto_increment” | “select,insert,update,references” | “自增主键” | ||
“name” | “int(11)” | “NO” | “select,insert,update,references” | “姓名” | ||||
“create_time” | “timestamp” | “NO” | “CURRENT_TIMESTAMP” | “select,insert,update,references” | “添加时间” |
从表格中,可以获取字段名称、类型、备注、是否主键、是否自增
查询出数据库的基本信后,把这信放到对象中,方便后续处理。
/** * 数据库表定义,从这里可以获取表名,字段信 */ public class TableDefinition { /** * 表名 */ private String tableName; /** * 表注释 */ private String comment; /** * 字段 */ private List<ColumnDefinition> columnDefinitions ... 省略 getter setter }其中TableDefinition类存放表信,ColumnDefinition类存放字段信
接下来是将TableDefinition对象中的变量绑定到Velocity模板当中去。
VelocityContext context = new VelocityContext(); TableDefinition tableDefinition = ... context.put("table", tableDefinition); context.put("columns", tableDefinition.getColumnDefinitions()); return VelocityUtil.generate(context, template);VelocityContext存放Velocity变量,在对象中放入两个变量table、columns,template是模板内容
然后再模板中就可以使用对应的变量了,对应的模板可以这么写:
/** * ${tablement} */ public class ${context.javaBeanName} { // Java字段信 #foreach($column in $columns) /** ${columnment} */ private ${column.javaTypeBox} ${column.javaFieldName}; #end // getter,setter部分 #foreach(${column} in ${columns}) public void set${column.javaFieldNameUF}(${column.javaTypeBox} ${column.javaFieldName}) { this.${column.javaFieldName} = ${column.javaFieldName}; } public ${column.javaTypeBox} get${column.javaFieldNameUF}() { return this.${column.javaFieldName}; } #end }得到生成结果后,把内容返回到前端页面。
处理多种数据库如何处理多种数据库,这里的关键点是要获取数据库的表结构以及字段信,每种数据库的获取SQL是不一样的,因此需要把获取表信和获取字段信抽象出来,然后让实际的数据库取实现抽象部分即可。
code-gen对应抽象类:
-
com.gitee.gen.gen.TableSelector 抽象类,用来获取表信 子类:
- com.gitee.gen.gen.mysql.MySqlTableSelector
- com.gitee.gen.gen.oracle.OracleTableSelector
- com.gitee.gen.gen.postgresql.PostgreSqlTableSelector
- com.gitee.gen.gen.sqlserver.SqlServerTableSelector
-
com.gitee.gen.gen.ColumnSelector 抽象类,用来获取表字段信 子类:
- com.gitee.gen.gen.mysql.MySqlColumnSelector
- com.gitee.gen.gen.oracle.OracleColumnSelector
- com.gitee.gen.gen.postgresql.PostgreSqlColumnSelector
- com.gitee.gen.gen.sqlserver.SqlServerColumnSelector
版权声明:本文标题:代码生成器原理 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1687009595a128277.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论