简单实现一个Mybatis Plus代码生产器
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MP中有个十分强大的工具——AutoGenerator代码生成器,通过AutoGenerator可以快速生产Entry、Mapper、Mapper Xml、Service、ServiceImpl、Contoller等各个模板的代码,可以极大提升开发效率。
实战练习:
添加依赖
MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖,并且在2.3.3之后表名也区分大小写了。
<!-- mybatis plus依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.2</version>
</dependency>
<!-- mybatis plus generator依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<!-- 旧版本的MP依赖其中包含了代码生成器并且不区分表名大小写-->
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>mybatis-plus</artifactId>-->
<!-- <version>2.3.3</version>-->
<!-- </dependency>-->
<!-- 模板引擎 依赖 MP支持 Velocity(默认)Freemarker Beetl -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!--数据库驱动,根据数据库选型选择数据库驱动依赖 -->
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- oracle驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
<!-- sqlserver驱动 -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>7.4.1.jre8</version>
<scope>test</scope>
</dependency>
<!-- postgresql驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- swagger2相关依赖,可选 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
编写配置
代码生产器提供了大量的自定义参数供用户选择
创建代码生成器对象
AutoGenerator ag = new AutoGenerator(); //代码生成器对象
配置 GlobalConfig
//全局配置
GlobalConfig gc = new GlobalConfig();
String outputDir = "D:\\workspace\\demo\\src\\main"; //文件生成路径
gc.setOutputDir(outputDir+"\\java"); //设置文件生产路径
gc.setSwagger2(true); //是否开启swagger2,需要引入swagger2依赖
gc.setAuthor("lion"); //开发人员
gc.setFileOverride(true); //是否覆盖已有文件
gc.setActiveRecord(true); //开启 ActiveRecord 模式
gc.setBaseResultMap(true);//开启 BaseResultMap
gc.setBaseColumnList(true);//开启 baseColumnList
gc.setEnableCache(true); //是否在xml中添加二级缓存配置
gc.setMapperName("%sMapper"); //设置各层文件名称方式
gc.setXmlName("%sMapper");
gc.setServiceImplName("%sServiceImpl");
gc.setServiceName("%sService");
gc.setControllerName("%sController");
//配置到代码生成器对象中
ag.setGlobalConfig(gc);
配置 DataSourceConfig
在这里配置数据库相关信息
//数据源配置
DataSourceConfig ds = new DataSourceConfig();
ds.setDbType(DbType.ORACLE); //数据库类型
ds.setDriverName("驱动名称"); //驱动名称
ds.setUrl("URL"); //驱动连接的URL
ds.setUsername("用户名"); //数据库连接用户名
ds.setPassword("密码");//数据库连接密码
ag.setDataSource(ds);
自定义模板引擎(可选)
需要继承AbstractTemplateEngine.
自定义代码模板(可选)
默认放到templates文件夹下,也可以指定模板文件:
//指定自定义模板路径, 位置:/resources/templates/entity2.java.ftl(或者是.vm)
//注意不要带上.ftl(或者是.vm), 会根据使用的模板引擎自动识别
TemplateConfig templateConfig = new TemplateConfig()
.setEntity("templates/entity2.java");
AutoGenerator mpg = new AutoGenerator();
//配置自定义模板
mpg.setTemplate(templateConfig);
自定义属性注入(可选)
//自定义属性注入
InjectionConfig cfg = new InjectionConfig() {
//自定义属性注入:abc
//在.ftl(或者是.vm)模板中,通过${cfg.abc}获取属性
@Override
public void initMap() {
Map<String, Object> map = new HashMap<>();
map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
this.setMap(map);
}
};
使用:
在文件entity2.java.ftl
自定义属性注入abc=${cfg.abc}
在文件entity2.java.vm
自定义属性注入abc=$!{cfg.abc}
配置全局策略
//配置全局策略
StrategyConfig sc = new StrategyConfig();
//自定义继承的Controller类全称,带包名
sc.setSuperControllerClass("com.zkr.demo.Controller.BaseController");
sc.setNaming(NamingStrategy.underline_to_camel);//驼峰命名
sc.setInclude(new String[]{"表名"}); //需要包含的表名(与exclude需要排除的表名二选一配置),新版本注意大小写
ag.setStrategy(sc);
配置包信息
//包设置
PackageConfig pc = new PackageConfig();
pc.setController("Controller"); //Controller包名
pc.setEntity("model.entity"); //Entity包名
pc.setParent("com.zkr.demo"); //父包名
ag.setPackageInfo(pc);
前端文件生成
首先需要创建文件夹来保存生成的文件
final String viewOutputDir = outputDir + "\\view"; //前端页面生成路径
File viewDir = new File(viewOutputDir); //新建view文件夹
if (!viewDir.exists()) {
viewDir.mkdirs();
}
然后配置代码生成器文件输出配置
List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
focList.add(new FileOutConfig("/templates/listvue.vue.vm"){
@Override
public String outputFile(TableInfo tableInfo) {
return getGeneratorViewPath(viewOutputDir, tableInfo, ".vue"); //新建view文件
}
});
cfg.setFileOutConfigList(focList);
ag.setCfg(cfg);
需要先新建页面文件
/**
* 页面生成的文件名
*/
private static String getGeneratorViewPath(String viewOutputDir, TableInfo tableInfo, String suffixPath) {
String name = StringUtils.firstToLowerCase(tableInfo.getEntityName());
String path = viewOutputDir + "/" + name + "/index" + suffixPath;
File viewDir = new File(path).getParentFile();
if (!viewDir.exists()) {
viewDir.mkdirs();
}
return path;
}
执行生产
// 执行生成
ag.execute();
注意事项
- 如果是Springboot项目注意依赖之间的版本
- 如果是使用新版本的Mybatis-Plus 代码生成器 需要注意表名的大小写
- 注意文件生成路径的设置
- 如果需要自定义模板引擎需要放到templates路径下,或者在TemplateConfig 中配置。
参考
MybatisPlus:Error processing condition on com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoC…