这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
山有峰顶,海有彼岸,漫漫长路,终有回转,余味苦涩,终会有回甘。别被眼前的磨难打败了,或许光明就在你放弃前的那一刻。带着愉快的心情做一个愉快的梦,醒来后,又是新的一天。
前言
人和动物的区别有一项原因是:创造工具并能使用工具更能发展工具.
在项目中,每创建一个类,我们就需要创建controller
service
mapper
等文件, 这些东西如果数量很多,我们在做这些操作的时候就会感到很乏味.偷懒是人类的共性,创建工具是人的发展,因此就有了代码生成器. 虽然代码生成器不能生成所有的代码,但是我们可以通过调整,让他们生成我们项目中需要的共性代码.
开源的一些代码生成器
mybatis-plus-generator
MyBatis-Plus开源的一款工具,mybatis-plus-generator默认能够生成后端所有的代码,3.5.1+版本参数更多,如果看明白的话,能够适用于大部分的场景
MagicalCoder
MagicalCoder通过拖拽功能就能生成包含增删改查的前后端界面,现在有不同的版本,可以尝试
现在各种开源的后台管理系统
现在开源的各种后台管理系统,都包含了代码生成器,如果使用了这些开源框架,那么里面的代码生成器则是最为适配的.
自己造个轮子
原理分析
从数据库中读表的代码生成器的原理: 连接数据库,从数据库读取表结构(有一个单独管理表结构的系统库), 然后建立数据库字段与代码字段的关系, 然后通过写好的模版,通过模版引擎渲染出来.
前期准备
当前是从test类中创建的轮子,需要mysql驱动,freemarker模板引擎
<dependency>
<groupId>freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
复制代码
这里贴出的是核心代码,因为源代码经过了封装,这里为了简单,所有经过修改, 此处讲的是数据库表生成Entity类的过程, 也可以用在前后段代码上.
连接数据
Class.forName("com.mysql.cj.jdbc.Driver");
private static Connection con = DriverManager.getConnection("jdbc:mysql:///zdc_test?serverTimezone=UTC", "root", "root");
复制代码
获取需要生成代码的表结构
String tableName ="student";
String database ="zdc_test";
List<Map<String,String>> columns = new ArrayList<Map<String,String>>();
Statement stmt = con.createStatement();
String sql = "select column_name, data_type, column_key, is_nullable, column_comment from information_schema.columns where table_name='" + tableName + "'and table_schema='" + database+ "' ORDER BY ORDINAL_POSITION ";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){
HashMap<String,String> map = new HashMap<String,String>();
map.put("columnName", rs.getString("column_name"));
map.put("dataType", rs.getString("data_type"));
map.put("isKey", isEmpty(rs.getString("column_key"))?"false":"true");
map.put("notNull", rs.getString("is_nullable").equals("YES")?"false":"true");
map.put("comment", rs.getString("column_comment"));
columns.add(map);
}
复制代码
将数据库下划线字段转成Java驼峰字段,将数据库数据类型对应为Java数据类型
for (Map<String, String> column : columns) {
column.put("fieldName", column2Property(column.get("columnName")));// 实体属性名下划线字段转成Java驼峰字段
column.put("fieldType", columnType2FieldType(column.get("dataType")));// 实体属性类型 将数据库数据类型对应为Java数据类型
column.put("fieldNote", column.get("comment"));// 字段说明,即属性说明
}
复制代码
读取freemarker模板引擎
Configuration configuration= new Configuration();
configuration.setObjectWrapper(new DefaultObjectWrapper());
Template template =configuration.getTemplate("entity.ftl", "UTF-8")
复制代码
entity.ftl 模版
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ${sysFieldTableName} {
<#list sysParams as param>
// ${param.fieldNote}
private ${param.fieldType} ${param.fieldName};
</#list>
}
复制代码
freemarker模版渲染为对应的类
HashMap<String, Object> map = new HashMap<>();
map.put("param",column);
map.put("sysFieldTableName","Student");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("StudentEntity.java"), "UTF-8");
template.process(map,out);
out.flush();
out.close();
复制代码
最后
不想写了,字节的代码也不想看第二遍,源代码在这里,如果想自己写一个轮子的话就凑活着看,如果不写就不用看了
作者:ZOUZDC
链接:https://juejin.cn/post/7028963866063306760
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码