java代码生成器(附走不通的代码)

这是我参与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
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复制代码

Guess you like

Origin juejin.im/post/7032893637742559269