共计 5651 个字符,预计需要花费 15 分钟才能阅读完成。
本文是本系列文章的第七篇,前 6 篇拜访地址如下:
- 小书 MybatisPlus 第 1 篇 - 整合 SpringBoot 疾速开始增删改查
- 小书 MybatisPlus 第 2 篇 - 条件结构器的利用及总结
- 小书 MybatisPlus 第 3 篇 - 自定义 SQL
- 小书 MybatisPlus 第 4 篇 - 表格分页与下拉分页查问
- 小书 MybatisPlus 第 5 篇 -Active Record 模式精讲
- 小书 MybatisPlus 第 6 篇 - 主键生成策略精讲
一、代码生成器的根底实现原理
置信大部分的开发者都应用过或者据说过“模板引擎”,它能够帮咱们实现视图与数据的拆散,疾速开发视图页面,并将模板整合后果用于在浏览器显示。其外围实现原理就是:HTML 模板页面 + 页面数据 = 输入后果。页面视图输入的过程就是通过模板引擎实现的。
代码生成器的实现原理与模板引擎实现页面渲染的逻辑简直是统一的,除了上面的几个区别:
- 所谓模板:就是某语言的代码 + 模板引擎语法的占位符,该占位符用来数据天换。所以代码生成器的模板文件不再专指 HTML 页面模板文件,能够是任何类型的代码文件。
- 模板引擎的输入后果在我的项目中是输入给浏览器进行页面渲染的,然而对于代码生成器而言,模板引擎的输入后果是保留到磁盘文件。
二、如何编写模板文件
要编写模板文件,首先咱们要晓得失常的代码待如何书写。比方上面的 POJO 代码:
下面的 POJO 代码写成 Freemarker 模板文件,就是上面的样子:
package ${package.Entity};
<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;
</#if>
/**
* <p>
* ${table.comment!}
* </p>
*
* @author ${author}
* @since ${date}
*/
<#if entityLombokModel>
@Data
<#if superEntityClass??>
@EqualsAndHashCode(callSuper = true)
<#else>
@EqualsAndHashCode(callSuper = false)
</#if>
</#if>
public class ${entity} extends Model<${entity}> {
<#list table.fields as field>
private ${field.propertyType} ${field.propertyName};
</#list>
Mybatis Plus 代码生成的模板文件:https://gitee.com/baomidou/mybatis-plus/tree/3.0/mybatis-plus-generator/src/main/resources/templates
三、数据从哪里来?
有了模板文件,咱们想通过模板引擎生成代码,上面的一个问题就是数据从哪里来?有了数据咱们能力生成代码
- 从配置中来,比方:package 门路等一些动态化不常常变动的信息,一个我的项目生成的代码寄存的包门路通常不会常常变动。
- 从数据库中来,比方: 实体类名称、实体类字段名称、实体类字段类型等信息。相似于逆向工程,通过数据库表名、字段名、字段类型等信息生成实体信息。
3.1. 以 MySQL 的 INFORMATION_SCHEMA 信息获取为例
咱们的代码主动生成是针对数据库操作,所以首先要理解数据库表的构造
SELECT column_name,data_type,is_nullable,character_maximum_length,column_comment
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='kpi_task'
AND table_schema='home'
ORDER BY ordinal_position
如上图 SQL 查问的是 home 库,kpi_task 表的信息,如下:
- column_name 作为表的字段能够生成实体类的成员变量参数名称(通常是驼峰标识规定)
- data_type,is_nullable,character_maximum_length 可用于生成校验规定。
- 正文能够用于生成 column_comment
四、Mybatis Plus 代码生成器的应用
如果下面的代码生成器实现原理你都看懂了,上面的这些配置你也就不难理解了。
4.1. 增加依赖
- 增加 代码生成器 依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
-
增加 模板引擎 依赖,MyBatis-Plus 反对 Velocity(默认)、Freemarker、Beetl,用户能够抉择本人相熟的模板引擎。
Velocity(默认):
<dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.2</version> </dependency>
Freemarker:
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency>
Beetl:
<dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>3.1.8.RELEASE</version> </dependency>
留神!如果您抉择了非默认引擎,须要在 AutoGenerator 中 设置模板引擎。
AutoGenerator generator = new AutoGenerator();
// set freemarker engine
generator.setTemplateEngine(new FreemarkerTemplateEngine());
// set beetl engine
generator.setTemplateEngine(new BeetlTemplateEngine());
// set custom engine (reference class is your custom engine class)
generator.setTemplateEngine(new CustomTemplateEngine());
// other config
...
4.2. 代码生成配置
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 能够疾速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的晋升了开发效率。
执行上面的这个测试用例,Mybatis Plus 就能够帮忙咱们实现以上各层的代码生成到对应的 package 门路上面
public class CodeGenerator {
@Test
public void startGenerator() {
//1、全局配置
GlobalConfig config = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
config.setActiveRecord(true)// 开启 AR 模式
.setAuthor("zimug")// 设置作者
.setOutputDir(projectPath + "/src/main/java")// 生成门路 (个别在此我的项目的 src/main/java 下)
.setFileOverride(true)// 第二次生成会把第一次生成的笼罩掉
.setOpen(true)// 生成结束后是否主动关上输入目录
//.setSwagger2(true)// 实体属性 Swagger2 注解
//.setIdType(IdType.AUTO)// 主键策略
.setServiceName("%sService")// 生成的 service 接口名字首字母是否为 I,这样设置就没有 I
.setBaseResultMap(true)// 生成 resultMap
.setBaseColumnList(true);// 在 xml 中生成根底列
//2、数据源配置
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL)// 数据库类型
.setDriverName("com.mysql.jdbc.Driver")
.setUrl("jdbc:mysql://localhost:3306/zimug")
.setUsername("root")
.setPassword("zimug3456");
//3、策略配置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setCapitalMode(true)// 开启全局大写命名
.setNaming(NamingStrategy.underline_to_camel)// 表名映射到实体的命名策略 (下划线到驼峰)
// 表字段映射属性名策略 (未指定按 naming)
.setColumnNaming(NamingStrategy.underline_to_camel)
//.setTablePrefix("tb_")// 表名前缀
//.setSuperEntityClass("你本人的父类实体, 没有就不必设置!")
//.setSuperEntityColumns("id");// 写于父类中的公共字段
//.setSuperControllerClass("自定义继承的 Controller 类全称,带包名, 没有就不必设置!")
.setRestControllerStyle(true) // 生成 @RestController 控制器
.setEntityLombokModel(true)// 应用 lombok
.setInclude("sys_user","sys_role");// 逆向工程应用的表
//4、包名策略配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.zimug.example")// 设置包名的 parent
.setMapper("mapper")
.setService("service")
.setController("controller")
.setEntity("entity")
.setXml("mapper");// 设置 xml 文件的目录
//5、整合配置
AutoGenerator autoGenerator = new AutoGenerator();
autoGenerator.setGlobalConfig(config)
.setDataSource(dataSourceConfig)
.setStrategy(strategyConfig)
.setPackageInfo(packageConfig);
//6、执行
autoGenerator.execute();}
}
欢送关注我的博客,外面有很多精品合集
- 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。
感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。
- 《手摸手教你学 Spring Boot2.0》
- 《Spring Security-JWT-OAuth2 一本通》
- 《实战前后端拆散 RBAC 权限管理系统》
- 《实战 SpringCloud 微服务从青铜到王者》
- 《VUE 深入浅出系列》