代码生成器的介绍
对于我来说,开发时最难受的时候除了有bug没有解决之外,就是做复制粘贴了。每次创建一个新的模块,都要重复的不断复制实体类的属性,然后在写上一次注释,再把代码中该继承的继承。用Mybatis-Plus的代码生成器AutoGenerator就可以省去这一部分的烦恼。它帮我直接把Entity、Mapper、Mapper XML、Service、Controller等文件预先生成好,也帮我把Entity对应的表做好了映射,也写好的注释,还有Service以及Mapper文件,也帮我把Mybatis-Plus需要用的父类继承好了。这样就省去我这一部分的开发工作。
代码生成器的依赖
除了一章节的Mybatis-Plus的核心依赖以外,还需要添加两个重要的依赖:
<!--mybatisplus的代码生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.2</version>
</dependency>
以及
<!--freemarker模板引擎-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
代码生成工具类
AutoGenerator
代码生成器的主类,之后的各种配置都会添加到这个类里面,例如:
- GlobalConfig(全局配置);
- DataSourceConfig(数据源配置);
- PackageConfig(包配置);
- TemplateConfig(模板配置)
- InjectionConfig(自定义配置);
- StrategyConfig(策略配置(数据库表配置));
AutoGenerator mpg = new AutoGenerator();// 代码生成器主类
GlobalConfig
全局配置,定义文件的输出目录,设置文件的@author信息等
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");// 获取用户程序当前路径(项目根的路径)
gc.setOutputDir(projectPath + "/src/main/java");// 生成文件的输出目录(默认值:D 盘根目录)
gc.setAuthor("ck");// 开发人员(默认值:null)
gc.setOpen(false);// 是否打开输出目录(默认值:null)
gc.setFileOverride(true);// 是否覆盖已有文件(默认值:false)
mpg.setGlobalConfig(gc);//把全局配置添加到代码生成器主类
DataSourceConfig
数据源配置,这个比较清晰了,数据库表映射实体类时需要配置数据库的连接信息。
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://47.103.17.3:3306/lm_dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8");
dsc.setSchemaName("public");// 数据库 schema name(例如 PostgreSQL 可指定为 public)
dsc.setDbType(DbType.MYSQL);// 数据库类型
dsc.setDriverName("com.mysql.cj.jdbc.Driver");// 驱动名称
dsc.setUsername("chenkang"); // 用户名
dsc.setPassword("258963"); // 密码
类型转换 默认由 dbType 类型决定选择对应数据库内置实现。
实现 ITypeConvert 接口自定义数据库 字段类型 转换为自己需要的 java 类型,也可以直接重写自带的MySqlTypeConvert类的processTypeConvert方法,是一个道理
dsc.setTypeConvert(new MySqlTypeConvert() {
@Override
public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
return super.processTypeConvert(globalConfig, fieldType);
}
});
mpg.setDataSource(dsc);//把数据源配置添加到代码生成器主类
PackageConfig
包配置,就是每个类最上面的package,比如:package com.ck.mybatisplus.foundation.service;这里包配置可以分别配置service、entity、controller等等
PackageConfig pc = new PackageConfig();
pc.setModuleName("foundation");// 父包模块名
pc.setParent("com.ck.mybatisplus");// 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
pc.setService("service");// Service包名
pc.setEntity("entity");// Entity包名
pc.setServiceImpl("service.impl");// ServiceImpl包名
pc.setMapper("mapper");// Mapper包名
pc.setController("controller");// Contoller包名
// pc.setXml("mapper.xml");// Mapper.xml包名
mpg.setPackageInfo(pc);// 把包配置添加到代码生成器主类
TemplateConfig
模板配置,配置模板,此模板配置默认生成mybatisplus自带模板的controller.java、service.java、serviceImpl.java、mapper.java、.xml、entity类的文件
若不想用默认的模板生成的文件,有两种方法:
- 一种是直接set自定义的模板路径,如下面的templateConfig.setController("/templates/MyController.java.ftl")
- 第二种是使用自定义配置(下面有讲解),前提是要先把默认值设为null,如templateConfig.setXml(null)。两种方法的共同点是都需要先有自定义的模板文件,
不同是第一种的文件生成路径是在前面的包配置固定了的,第二种是连文件生成的路径都是可以自定义的!
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
// templateConfig.setController("/templates/MyController.java.ftl");
mpg.setTemplate(templateConfig);// 把模板配置添加到代码生成器主类
InjectionConfig
自定义配置,前面也说了,只要有相应的模板文件,基本上能满足在项目中任何位置生成你想要的文件,比如.java、.xml、.jsp文件等,首先new出自定义配置的对象,如下
InjectionConfig cfg = new InjectionConfig() {
/**
* 使用initMap是抽象方法,所以必须被重写,
* 注入自定义 Map 对象(注意需要setMap放进去),该对象可以传递到模板引擎通过 cfg.xxx 引用
*/
@Override
public void initMap() {
Map<String, Object> map = new HashMap<>();
map.put("mapperId", "testMapperId");
this.setMap(map);
}
};
然后配置模板的路径
.ftl表示是模板引擎是 freemarker,还有.vm表示模板引擎是 velocity等等
String templatePath = "/templates/mapper.xml.ftl";
再自定义输出配置,配置 FileOutConfig 指定模板文件、输出文件达到自定义文件生成目的,如果同时自定义两个或多个以上,可以直接focList.add多个new FileOutConfig(templatePath) {}配置
自定义配置会被优先输出
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
自定义判断是否创建文件,该配置用于判断某个类是否需要覆盖创建,如果想覆盖之前已生成的文件,isCreate方法直接返回true,默认是false
一般情况可以不用配置这个,直接使用默认的不覆盖
cfg.setFileCreate(new IFileCreate() {
@Override
public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
// 判断自定义文件夹是否需要创建,
// checkDir("调用默认方法创建的目录");
// 当然也可以自定义哪些文件可以被覆盖哪些不可以被覆盖,更新判断逻辑返回true或者false
return false;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
StrategyConfig
数据库表配置,通过该配置,可指定需要生成哪些表或者排除哪些表等信息,
StrategyConfig strategy = new StrategyConfig();
// 数据库表映射到实体的命名策略:下划线转驼峰
strategy.setNaming(NamingStrategy.underline_to_camel);
// 数据库表字段映射到实体的命名策略, 未指定按照 naming 执行
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// 自定义继承类全称,带包名 (以下为示例)
strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
strategy.setEntityLombokModel(true);// 【实体】是否为lombok模型(默认 false)
strategy.setRestControllerStyle(true);// 生成 @RestController 控制器
strategy.setSuperEntityColumns("id");// 写于父类中的公共字段
strategy.setInclude("fnd_user");// 需要包含的表名,允许正则表达式(与exclude二选一配置)
strategy.setExclude("m_fnd_user1");// 需要排除的表名,允许正则表达式
strategy.setControllerMappingHyphenStyle(true);// 驼峰转连字符
strategy.setEntityTableFieldAnnotationEnable(true);// 是否生成实体时,生成字段注解 默认false;
strategy.setTablePrefix(pc.getModuleName() + "_");// 表前缀
mpg.setStrategy(strategy);// 把策略配置添加到代码生成器主类
模板引擎
向代码生成器主类上配置模板引擎,这是是freemarker,mpg.execute()方法就是执行生成代码类。
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
以上内容来源于