本片博客只讲述了实现过程和功能,具体源码在我的百度云盘上获取:
链接:https://pan.baidu.com/s/1Gree8UreYtcZjHelOh6FRw 提取密码:oheo
原理:导入模板,连接数据库获取数据库表的元数据,解析获取到的元数据,将解析到的所有表的数据遍历,使用FreeMarker将数据与模板合成,最终以输出流的形式生成文件。
〇、代码生成器的三要素
- 数据
- 模板
- 合成机制
一、实现功能
- 自动生成实体类(pojo)
- 自动生成mapper接口
- 自动生成SQL映射文件
二、实现步骤
- 编写要自动生成的FreeMarker模板,如实体类(pojo.ftl)、mapper接口(mapper.ftl)、SQL映射文件(sql.ftl)。编写模板可以根据自己的需求自定义编写。
- 创建TableVo类。用来保存从数据库中获取到的表的信息。此类中创建的字段如下
-
1.帕斯卡风格的类名(className):创建实体类文件时所需的文件名
2.骆驼风格的类名(camelName):创建mapper接口文件时,方法中以实体类作为参数时需要的对象名
3.下划线风格的表名(tableName):创建SQL映射文件时,SQL语句需要的表名;还有用它进行转换,转换成所需的帕斯卡命名和骆驼命名
4.表注释(comment):获取表注释,生成类的描述
5.列集合(columns):获取对应表中所有列的所有信息
-
-
创建ColumnVo类。用来保存对应列的所有信息。
-
获取Java类的字段名(fieldName)及字段类型(javaType),生成Java类时需要用到
-
获取到数据库列的类型(dbType):用来进行判断,“转为”对应的字段类型
-
获取到数据库列名称(name):用来进行转换成类变量;SQL映射文件中,对表操作也需要列也是自动生成的
-
列注释(comment):自动生成为字段的注释
-
帕斯卡命名的列名(upperCaseColumnName):创建类时,自动生成get set方法
-
-
创建转换工具类(JavaNameConvertTool类)。目的是为了:
-
将下划线的表名或列名转为帕斯卡风格类名(toCamel方法)和骆驼风格类名(toPascal方法)
-
将表中字段类型转为java类的字段类型(dbTypeToJavaType方法)
-
-
创建获取数据库元数据的工具类(ParseMetadataUtil类)。目的是为了:
-
连接数据库获取元数据(openConnection方法),再从元数据中获取所有表的信息(getTables)和列的信息(getColumns方法)
-
-
抽象出一个代码生成器类(CodeGeneratorAbstract类)。
-
创建CodeGeneratorAbstract有参构造方法,通过传入的参数(模板文件名)初始化Configuration、Template等对象
-
解析元数据获取表以及表所对应的所有列信息封装到 tableVos 中
-
抽象出一个代码生成器方法(generateCode方法)。因为本代码生成器在生成文件时,保存在不同根目录下
-
-
创建实体生成器类(PojoCodeGenerator类)。继承CodeGeneratorAbstract类,重写generateCode方法
-
创建mapper文件和SQL映射文件生成器类(MapperAndXmlGenerator类)。继承CodeGeneratorAbstract类,重写generateCode,注意看这个方法的实现过程,我把生成的对应的mapper接口文件和SQL映射文件放在了同一个目录下,且他们的上一级目录是表名没有下划线的风格。源码中: