信步漫谈之MyBatisPlus——自动生成代码
目录
- 1 目的
- 2 程序结构
- 3 程序代码
- 4 生成效果
- 5 其他
- 6 参考资料(感谢)
1 目的
使用MybatisPlus的自动生成工具,进行自动生成代码,留存操作方式,可使用伪代码实现。
2 程序结构
com.alfred.mybatisplus.autogenerator
∟ pom.xml
∟ src
∟ main
∟ java
∟ com
∟ alfred
∟ mybatisplus
∟ autogenerator
∟ CodeGenerator.java
∟ resources
∟ templates
∟ mapper.xml.ftl
∟ test
∟ java
3 程序代码
- CodeGenerator.java
package com.alfred.mybatisplus.autogenerator;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.*;
/**
* @Author: alfred
* @Date: 2021/1/21
* @description:
*/
public class CodeGenerator {
private static String PROJECT_PATH = "com.alfred.mybatisplus.autogenerator";
private static String TABLE_NAME = "";
private static String ENTITY_NAME = "";
/**
* 全局配置
*/
private static final String AUTHOR = "alfred";
/**
* 数据源配置
*/
private static final String DB_URL = "jdbc:mysql://127.0.0.1:3306/mybatisplus";
private static final String DB_DRIVER = "com.mysql.jdbc.Driver";
private static final String DB_USERNAME = "root";
private static final String DB_PASS = "123456";
/**
*
* 读取控制台内容
*
*/
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.isNotBlank(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
//输入参数
TABLE_NAME = scanner("表名");
ENTITY_NAME = scanner("实体名");
//代码生成器
AutoGenerator mpg = new AutoGenerator();
//全局配置
mpg.setGlobalConfig(getGlobalConfig());
//数据源配置
mpg.setDataSource(getDataSourceConfig());
//包配置
mpg.setPackageInfo(getPackageInfoConfig());
//模板配置
mpg.setTemplate(getTemplateConfig());
//模板引擎配置
mpg.setTemplateEngine(getTemplateEngineConfig());
//策略配置
mpg.setStrategy(getStrategyConfig());
//自定义配置
mpg.setCfg(getInjectionConfig());
//生成
mpg.execute();
}
private static GlobalConfig getGlobalConfig() {
GlobalConfig gc = new GlobalConfig();
// String projectPath = System.getProperty("user.dir");
//作者
gc.setAuthor(AUTHOR);
//是否打开输出目录
gc.setOpen(false);
// 是否覆盖目录
gc.setFileOverride(true);
// 是否Swagger2注解
gc.setSwagger2(true);
// 是否开启二级缓存
gc.setEnableCache(false);
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
//主键策略
gc.setIdType(IdType.INPUT);
//设置命名格式
gc.setEntityName("%s");
gc.setControllerName("%sController");
gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
gc.setServiceName("I%sService");
gc.setServiceImplName("%sServiceImpl");
return gc;
}
private static DataSourceConfig getDataSourceConfig() {
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl(DB_URL);
dsc.setDriverName(DB_DRIVER);
dsc.setUsername(DB_USERNAME);
dsc.setPassword(DB_PASS);
return dsc;
}
private static PackageConfig getPackageInfoConfig() {
PackageConfig pc = new PackageConfig();
//设置主包名
pc.setParent(PROJECT_PATH);
return pc;
}
private static TemplateConfig getTemplateConfig() {
TemplateConfig tc = new TemplateConfig();
return tc;
}
private static AbstractTemplateEngine getTemplateEngineConfig() {
// 使用 freemarker 模板引擎
return new FreemarkerTemplateEngine();
}
private static StrategyConfig getStrategyConfig() {
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude(TABLE_NAME);
strategy.setControllerMappingHyphenStyle(true);
strategy.setEntityTableFieldAnnotationEnable(true);
return strategy;
}
private static InjectionConfig getInjectionConfig() {
//自定义注入信息配置
Map map = new HashMap<>();
//此处传递自定义参数后,可在模板ftl文件中使用${cfg.my_define}引用该参数
map.put("my_define", "my_define");
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
this.setMap(map);
}
};
cfg.setFileOutConfigList(getFileOutConfig());
return cfg;
}
private static List getFileOutConfig() {
List focList = new ArrayList<>();
String mapperTemplatePath = "/templates/mapper.xml.ftl";
// 自定义配置会被优先输出
focList.add(new FileOutConfig(mapperTemplatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
return PROJECT_PATH + "/src/main/resources/mapper/" + ENTITY_NAME + "Mapper" + StringPool.DOT_XML;
}
});
String controllerTemplatePath = "/templates/controller.java.ftl";
// 自定义配置会被优先输出
focList.add(new FileOutConfig(controllerTemplatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
return PROJECT_PATH + "/src/main/java/com/alfred/mybatisplus/autogenerator/controller/" + ENTITY_NAME + "Controller" + StringPool.DOT_JAVA;
}
});
String entityTemplatePath = "/templates/entity.java.ftl";
// 自定义配置会被优先输出
focList.add(new FileOutConfig(entityTemplatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
return PROJECT_PATH + "/src/main/java/com/alfred/mybatisplus/autogenerator/entity/" + ENTITY_NAME + StringPool.DOT_JAVA;
}
});
String serviceTemplatePath = "/templates/service.java.ftl";
// 自定义配置会被优先输出
focList.add(new FileOutConfig(serviceTemplatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
return PROJECT_PATH + "/src/main/java/com/alfred/mybatisplus/autogenerator/service/I" + ENTITY_NAME + "Service" + StringPool.DOT_JAVA;
}
});
String serviceImplTemplatePath = "/templates/serviceImpl.java.ftl";
// 自定义配置会被优先输出
focList.add(new FileOutConfig(serviceImplTemplatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
return PROJECT_PATH + "/src/main/java/com/alfred/mybatisplus/autogenerator/service/impl/" + ENTITY_NAME + "ServiceImpl" + StringPool.DOT_JAVA;
}
});
return focList;
}
}
- mapper.xml.ftl
<?xml version="1.0" encoding="UTF-8"?>
<#if enableCache>
#if>
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
com.alfred.version
version-mybatisplus-general
1.0.0-SNAPSHOT
4.0.0
com.alfred.mybatisplus
mybatisplus-autogenerator
1.0.0-SNAPSHOT
功能:使用MybatisPlus的自动生成工具,进行自动生成代码,留存操作方式,可使用伪代码实现。
com.baomidou
mybatis-plus-boot-starter
com.baomidou
mybatis-plus
com.baomidou
mybatis-plus-generator
mysql
mysql-connector-java
jar
compile
org.freemarker
freemarker
compile
org.apache.maven.plugins
maven-compiler-plugin
3.1
${java.version}
${java.version}
org.apache.maven.plugins
maven-surefire-plugin
com.baomidou.mybatisplus.samples.generator.MpGeneratorTest
org.codehaus.mojo
cobertura-maven-plugin
2.7
html
xml
lombok.Generated
clean
- 数据库sql
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) COLLATE utf8_bin DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
4 生成效果
- 输入生成条件
请输入表名:
user
请输入实体名:
User
- 生成目录结构
com.alfred.mybatisplus.autogenerator
∟ pom.xml
∟ src
∟ main
∟ java
∟ com
∟ alfred
∟ mybatisplus
∟ autogenerator
∟ CodeGenerator.java
∟ controller
∟ UserController.java
∟ entity
∟ User.java
∟ service
∟ impl
∟ UserServiceImpl.java
∟ IUserService.java
∟ resources
∟ mapper
∟ UserMapper.xml
∟ templates
∟ mapper.xml.ftl
∟ test
∟ java
5 其他
- 模板文件可参考mybatis-plus-generator-3.4.1.jar包内的templates目录下,官方提供的默认模板
各类模板引擎官方都提供有模板参考,未指定则使用默认模板,可自定义
6 参考资料(感谢)
mybatis-plus官网指南
官网示例项目集合