引言
背景:为了提升开发效率,利用mybatisplus API读取数据库表结构生成对应的实体entity、服务service,通过模板生成映射mapper。
代码生成器完善: 增加Mapper注解和Fill填充
- Fill填充实现思路: 利用元对象字段填充控制器MetaObjectHandler,在插入和修改时,为一些字段指定默认值。
- 增加Mapper注解的实现思路:修改.ftl文件即可(使用freemarker引擎生成映射mapper)
I 预备知识
1.1 读取控制台内容
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
1.2 代码生成器的依赖配置
<!-- mybatis-plus代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<!-- mybatisPlus Freemarker 模版引擎 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
II 代码生成器
2.1 main方法的实现
/**
* 自动生成代码
*/
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// TODO 全局配置
GlobalConfig gc = new GlobalConfig();
// String projectPath = System.getProperty("user.dir");
// 生成文件的输出目录【默认 D 盘根目录】
String projectPath = "D:\\xxx\\xx\\core-common";
gc.setOutputDir(projectPath + "/src/main/java");
// 作者
gc.setAuthor("iOS逆向");
// 是否打开输出目录
gc.setOpen(false);
// controller 命名方式,注意 %s 会自动填充表实体属性
// gc.setControllerName("%sController");
// service 命名方式
gc.setServiceName("%sService");
// serviceImpl 命名方式
gc.setServiceImplName("%sServiceImpl");
// mapper 命名方式
gc.setMapperName("%sMapper");
// xml 命名方式
gc.setXmlName("%sMapper");
// 开启 swagger2 模式
gc.setSwagger2(true);
// 是否覆盖已有文件
gc.setFileOverride(true);
// 是否开启 ActiveRecord 模式
gc.setActiveRecord(true);
// 是否在xml中添加二级缓存配置
gc.setEnableCache(false);
// 是否开启 BaseResultMap
gc.setBaseResultMap(true);
// XML columList
gc.setBaseColumnList(false);
// 全局 相关配置
mpg.setGlobalConfig(gc);
// TODO 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://xx.com:3306/xx?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("iosrev");
dsc.setPassword("iosrev");
mpg.setDataSource(dsc);
// TODO 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("");
// 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
pc.setParent("com.qct.system.common");
// Entity包名
pc.setEntity("entity");
// Service包名
pc.setService("service");
// Service Impl包名
pc.setServiceImpl("service.impl");
mpg.setPackageInfo(pc);
// TODO 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 输出文件配置
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
}
});
// 自定义输出文件
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
mpg.setTemplate(new TemplateConfig().setXml(null));
// TODO 策略配置
完整代码请看原文:https://blog.csdn.net/z929118967/article/details/128534789
}
https://blog.csdn.net/z929118967/article/details/128534789
2.2 增加Mapper注解
- 引入freemarker 引擎
<!-- mybatisPlus Freemarker 模版引擎 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
- 配置templates
ftl模板文件
package ${package.Mapper};
import ${package.Entity}.${entity};
import ${superMapperClassPackage};
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* ${table.comment!} Mapper 接口
* </p>
*
* @author ${author}
* @since ${date}
*/
<#if kotlin>
interface ${table.mapperName} : ${superMapperClass}<${entity}>
<#else>
@Mapper
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
}
</#if>
- 加载模版文件
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
//自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 输出文件配置
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
}
});
// 自定义输出文件
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
2.3 Fill填充
实现思路: 利用元对象字段填充控制器MetaObjectHandler,在插入和修改时,为字段指定默认值。
- 实现MetaObjectHandler: 给字段指定默认值
@Component
public class iosMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
Long userId = KNLoginHelper.getUserId();
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
this.strictInsertFill(metaObject, "createId", Long.class, userId);
this.strictInsertFill(metaObject, "updateId", Long.class, userId);
}
@Override
public void updateFill(MetaObject metaObject) {
//填充方法有值不覆盖 不符合
//this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); // 起始版本 3.3.0(推荐使用)
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateId", KNLoginHelper.getUserId(), metaObject);
}
}
- 自定义需要填充的字段
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 自定义需要填充的字段
List<TableFill> tableFillList = new ArrayList<>();
tableFillList.add(new TableFill("create_time", FieldFill.INSERT));
tableFillList.add(new TableFill("create_id", FieldFill.INSERT));
tableFillList.add(new TableFill("update_time", FieldFill.INSERT_UPDATE));
tableFillList.add(new TableFill("update_id", FieldFill.INSERT_UPDATE));
strategy.setTableFillList(tableFillList);
mpg.setStrategy(strategy);
see also
Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-words</artifactId>
<version>22.10</version>
</dependency>
模板替换工具类
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.Version;
/**
*
* @param dataMap 存储数据的map集合
* @param savePath 生成word保存路径
*/
public static void ftl2Word(Map<String, Object> dataMap, String savePath) {
try {
Configuration configuration = new Configuration(new Version("2.3.0"));
configuration.setDefaultEncoding("utf-8");
//.ftl配置文件所在路径
Template template = configuration.getTemplate("demo.ftl", "utf-8");
/*File file = new File("resources/static");
String absolutePath = file.getAbsolutePath();*/
//上面获取路径有bug,absolutePath 既存demo.ftl的路径,不包含demo.ftl
// 如:D:\IdeaProjectsTwo\beauty-master\beauty-main\src\main\resources\static
configuration.setDirectoryForTemplateLoading(new File(absolutePath));
//输出文档路径及名称
File outFile = new File(savePath);
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),
"utf-8"), 10240);
template.process(dataMap, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}