1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MyBatis-Plus Generator v3.5.1 最新代码自动生成器

MyBatis-Plus Generator v3.5.1 最新代码自动生成器

时间:2020-05-23 15:18:25

相关推荐

MyBatis-Plus Generator v3.5.1 最新代码自动生成器

一、概述

官网:/

官方文档 :/pages/56bac0/

官方源码地址:/baomidou/mybatis-plus

官方原话:

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成

Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

配置环境

开发工具 IDEAJDK 15数据库 Mysql 、Oracle …基于SpringBoot开发框架

特性

无侵入:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对现有的 Mybatis 构架产生任何影响,而且 MP 支持所有 Mybatis 原生的特性依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对象操作预防Sql注入:内置Sql注入剥离器,有效预防Sql注入攻击通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Entity、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator 更加强大!)支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )支持关键词自动转义:支持数据库关键词(order、key……)自动转义,还可自定义关键词内置分页插件:基于Mybatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作

二、配置说明

2.1 数据库配置(DataSourceConfig)

基础配置

new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456").build();

可选配置

/*** 初始化数据源配置*/private static DataSourceConfig initDataSourceConfig() {return new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456").dbQuery(new MySqlQuery()).schema("mybatis-plus").typeConvert(new MySqlTypeConvert()).keyWordsHandler(new MySqlKeyWordsHandler()).build();}

2.2 全局配置(GlobalConfig)

/*** 初始化全局配置*/private static GlobalConfig initGlobalConfig(String projectPath) {return new GlobalConfig.Builder().outputDir(projectPath + "/src/main/java")//指定生成文件的根目录.author("Jack") //Author设置作者.disableOpenDir() //禁止打开输出目录,禁止打开输出目录//.enableSwagger() //开启 swagger 模式,开启 swagger 模式.fileOverride() //禁止打开输出目录,默认值:false.dateType(DateType.ONLY_DATE)//设置时间类型.commentDate("yyyy-MM-dd") //注释日期.build();}

2.3 包配置(PackageConfig)

/*** 初始化包配置*/private static PackageConfig initPackageConfig(String projectPath,String moduleName) {Props props = new Props("generator.properties");Map<OutputFile, String> pathInfo = new HashMap();pathInfo.put(OutputFile.mapperXml, projectPath + "/src/main/resources/mapper/" + moduleName);pathInfo.put(OutputFile.other,projectPath + "/src/main/resources/other/" + moduleName);return new PackageConfig.Builder().parent(props.getStr("package.base")) // 父包名.moduleName(moduleName)//父包模块名.entity("model") //实体类 Entity 包名,默认值:entity.service("service")//Service 包名,默认值:entity.serviceImpl("service.impl") //实现类 Service Impl 包名默认值:service.impl.mapper("mapper") //Mapper 包名默认值:mapper.xml("mapper.xml") //Mapper XML 包名默认值:mapper.xml.controller("controller") //Controller 包名默认值:controller.other("other") //自定义文件包名可使用"other",生产一个other文件目录.pathInfo(pathInfo)//路径配置信息.build();}

2.4 模板配置(TemplateConfig)

/*** 初始化模板配置* 可以对controller、service、entity模板进行配置*/private static TemplateConfig initTemplateConfig() {return new TemplateConfig.Builder().entity("/templates/vue/entity.java").service("/templates/vue/service.java").serviceImpl("/templates/vue/serviceImpl.java").mapper("/templates/vue/mapper.java").mapperXml("/templates/vue/mapper.xml").controller("/templates/vue/controller.java").build();}

MyBatis-Plus 原生默认模板:

2.5 注入配置(InjectionConfig)

/*** 初始化自定义配置*/private static InjectionConfig initInjectionConfig(String projectPath) {/**自定义生成模板参数**/Map<String,Object> paramMap = new HashMap<>();/** 自定义 生成类**/Map<String, String> customFileMap = new HashMap();customFileMap.put("/api/%sApi.js", "templates/vue/api.js.vm");customFileMap.put("/%s/index.vue", "templates/vue/index.vue.vm");// 自定义配置return new InjectionConfig.Builder().beforeOutputFile((tableInfo, objectMap) -> {customFileMap.forEach((key, value) -> {System.out.println(key+ " : " + value);});System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());}).customMap(paramMap).customFile(customFileMap).build();}

注意 : 使用时注意,自定义模板中使用 %s 转译符不会被替换,要想实现自定义模板的文件名自动替换需要重新模板引擎

这个是原本模板引擎源码部分:

这部分是重写后模板引擎源码部分:

2.6 策略配置(StrategyConfig)

new StrategyConfig.Builder().enableCapitalMode().enableSkipView().disableSqlFilter().likeTable(new LikeTable("USER")).addInclude("t_simple").addTablePrefix("t_", "c_").addFieldSuffix("_flag").build();

2.6.1 Entity 策略配置

new StrategyConfig.Builder().entityBuilder().superClass(BaseEntity.class).disableSerialVersionUID().enableChainModel().enableLombok().enableRemoveIsPrefix().enableTableFieldAnnotation().enableActiveRecord().versionColumnName("version").versionPropertyName("version").logicDeleteColumnName("deleted").logicDeletePropertyName("deleteFlag").naming(NamingStrategy.no_change).columnNaming(NamingStrategy.underline_to_camel).addSuperEntityColumns("id", "created_by", "created_time", "updated_by", "updated_time").addIgnoreColumns("age").addTableFills(new Column("create_time", FieldFill.INSERT)).addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE)).idType(IdType.AUTO).formatFileName("%sEntity").build();

2.6.2 Controller 策略配置

new StrategyConfig.Builder().controllerBuilder().superClass(BaseController.class).enableHyphenStyle().enableRestStyle().formatFileName("%sAction").build();

2.6.3 Service 策略配置

new StrategyConfig.Builder().serviceBuilder().superServiceClass(BaseService.class).superServiceImplClass(BaseServiceImpl.class).formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImp").build();

2.6.4 Mapper 策略配置

new StrategyConfig.Builder().mapperBuilder().superClass(BaseMapper.class).enableMapperAnnotation().enableBaseResultMap().enableBaseColumnList().cache(MyMapperCache.class).formatMapperFileName("%sDao").formatXmlFileName("%sXml").build();

注意: 使用时,先看清楚归于哪一类的配置,避免出现找不到的情况!

三、MyBatis-Plus Generator

2.1、导入依赖

<!--使用Controller注解需要使用--><dependencies><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!--自动生成器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.2</version></dependency><!--pagehelper分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.2</version></dependency><!--velocity模板引擎--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><!--freemarker模板引擎--><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.29</version></dependency><!--springboot测试类--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--Swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency></dependencies>

2.2、运行类(放在测试类中即可)

package generator;import cn.hutool.core.util.StrUtil;import cn.hutool.setting.dialect.Props;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.config.*;import com.baomidou.mybatisplus.generator.config.po.LikeTable;import com.baomidou.mybatisplus.generator.config.querys.OracleQuery;import com.baomidou.mybatisplus.generator.config.rules.DateType;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;import com.baomidou.mybatisplus.generator.function.ConverterFileName;import com.baomidou.mybatisplus.annotation.FieldFill;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.generator.FastAutoGenerator;import com.baomidou.mybatisplus.generator.config.DataSourceConfig;import com.baomidou.mybatisplus.generator.config.InjectionConfig;import com.baomidou.mybatisplus.generator.config.OutputFile;import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;import com.baomidou.mybatisplus.generator.config.rules.DateType;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import com.baomidou.mybatisplus.generator.fill.Column;import com.baomidou.mybatisplus.generator.fill.Property;import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;import config.TimerVelocityTemplateEngine;import java.io.File;import java.util.Collections;import java.util.HashMap;import java.util.Map;import java.util.Scanner;import java.util.function.Consumer;/*** MyBatisPlus代码生成器* 3.5.1*/public class MyBatisPlusGenerator {public static void main(String[] args) {// 获取当前目录路径String projectPath = System.getProperty("user.dir");String moduleName = "cctv";//scanner("模块名");String[] tableNames = {"MVNO_TARIFF_TABLE"};//scanner("表名,多个英文逗号分割").split(",");// 代码生成器: 数据源配置AutoGenerator autoGenerator = new AutoGenerator(initDataSourceConfig());// 全局配置autoGenerator.global(initGlobalConfig(projectPath));// 包配置,如模块名、实体、mapper、service、controller等autoGenerator.packageInfo(initPackageConfig(projectPath,moduleName));// 模板配置autoGenerator.template(initTemplateConfig());// 自定义配置autoGenerator.injection(initInjectionConfig(projectPath));// 策略配置autoGenerator.strategy(initStrategyConfig(tableNames));// 使用Freemarker引擎模板,默认的是Velocity引擎模板//autoGenerator.execute(new VelocityTemplateEngine());autoGenerator.execute(new TimerVelocityTemplateEngine());}/*** 读取控制台内容信息*/private static String scanner(String tip) {Scanner scanner = new Scanner(System.in);System.out.println(("请输入" + tip + ":"));if (scanner.hasNext()) {String next = scanner.next();if (StrUtil.isNotEmpty(next)) {return next;}}throw new MybatisPlusException("请输入正确的" + tip + "!");}/*** 初始化数据源配置*/private static DataSourceConfig initDataSourceConfig() {// 读取当前源文件配置Props props = new Props("generator.properties");// jdbc路径String url = props.getStr("dataSource.url");// 数据库账号String username = props.getStr("dataSource.username");// 数据库账号String password = props.getStr("dataSource.password");return new DataSourceConfig.Builder(url,username,password) //设置数据源.dbQuery(new OracleQuery())//设置数据库查询器.build();}/*** 初始化全局配置*/private static GlobalConfig initGlobalConfig(String projectPath) {return new GlobalConfig.Builder().outputDir(projectPath + "/src/main/java")//指定生成文件的根目录.author("Jack") //Author设置作者.disableOpenDir() //禁止打开输出目录,禁止打开输出目录//.enableSwagger() //开启 swagger 模式,开启 swagger 模式.fileOverride() //禁止打开输出目录,默认值:false.dateType(DateType.ONLY_DATE)//设置时间类型.commentDate("yyyy-MM-dd") //注释日期.build();}/*** 初始化包配置*/private static PackageConfig initPackageConfig(String projectPath,String moduleName) {Props props = new Props("generator.properties");Map<OutputFile, String> pathInfo = new HashMap();pathInfo.put(OutputFile.mapperXml, projectPath + "/src/main/resources/mapper/" + moduleName);pathInfo.put(OutputFile.other,projectPath + "/src/main/resources/other/" + moduleName);return new PackageConfig.Builder().parent(props.getStr("package.base")) // 父包名.moduleName(moduleName)//父包模块名.entity("model") //实体类 Entity 包名,默认值:entity.service("service")//Service 包名,默认值:entity.serviceImpl("service.impl") //实现类 Service Impl 包名默认值:service.impl.mapper("mapper") //Mapper 包名默认值:mapper.xml("mapper.xml") //Mapper XML 包名默认值:mapper.xml.controller("controller") //Controller 包名默认值:controller.other("other") //自定义文件包名可使用"other",生产一个other文件目录.pathInfo(pathInfo)//路径配置信息.build();}/*** 初始化模板配置* 可以对controller、service、entity模板进行配置*/private static TemplateConfig initTemplateConfig() {return new TemplateConfig.Builder().entity("/templates/vue/entity.java").service("/templates/vue/service.java").serviceImpl("/templates/vue/serviceImpl.java").mapper("/templates/vue/mapper.java").mapperXml("/templates/vue/mapper.xml").controller("/templates/vue/controller.java").build();}/*** 初始化自定义配置*/private static InjectionConfig initInjectionConfig(String projectPath) {/**自定义生成模板参数**/Map<String,Object> paramMap = new HashMap<>();/** 自定义 生成类**/Map<String, String> customFileMap = new HashMap();customFileMap.put("/api/%sApi.js", "templates/vue/api.js.vm");customFileMap.put("/%s/index.vue", "templates/vue/index.vue.vm");// 自定义配置return new InjectionConfig.Builder().beforeOutputFile((tableInfo, objectMap) -> {customFileMap.forEach((key, value) -> {System.out.println(key+ " : " + value);});System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());}).customMap(paramMap).customFile(customFileMap).build();}private static Consumer<InjectionConfig.Builder> getInjectionConfigBuilder() {return consumer -> {};}/*** 初始化策略配置*/private static StrategyConfig initStrategyConfig(String[] tableNames) {StrategyConfig.Builder builder = new StrategyConfig.Builder();builder.enableCapitalMode()//开启大写命名,默认值:false//.enableSkipView()//开启跳过视图,默认值:false//.disableSqlFilter()//禁用sql过滤,默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关//.enableSchema()//启用 schema, 默认值:false,多 schema 场景的时候打开.entityBuilder().naming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略,默认下划线转驼峰命名:NamingStrategy.underline_to_camel.columnNaming(NamingStrategy.underline_to_camel)//数据库表字段映射到实体的命名策略,默认为 null,未指定按照 naming 执行//.superClass()//设置父类: BaseEntity.class || com.baomidou.global.BaseEntity//.idType(IdType.ASSIGN_ID) //全局主键类型.disableSerialVersionUID() // 禁用生成 serialVersionUID,默认值:true//.enableColumnConstant()//开启生成字段常量,默认值:false.enableChainModel()//开启链式模型,默认值:false.enableLombok()//开启 lombok 模型,默认值:false.enableRemoveIsPrefix()//开启 Boolean 类型字段移除 is 前缀,默认值:false.enableTableFieldAnnotation()//开启生成实体时生成字段注解,默认值:false//.enableActiveRecord()//开启 ActiveRecord 模型,默认值:false//.logicDeleteColumnName("deleted") // 逻辑删除字段名(数据库)//.logicDeletePropertyName("deleted") // 逻辑删除属性名(实体)//.addTableFills(new Column("create_time", FieldFill.INSERT)) // 自动填充配置 create_time update_time 两种方式//.addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))//.versionColumnName("version") // 开启乐观锁.formatFileName("%s")//格式化文件名称.controllerBuilder()//.superClass()//设置父类: BaseController.class || com.baomidou.global.BaseController.enableHyphenStyle() //开启驼峰转连字符,默认值:false.enableRestStyle()//开启生成@RestController 控制器,默认值:false.formatFileName("%sController")//格式化文件名称.serviceBuilder()//.superServiceClass() //设置 service 接口父类: BaseService.class || com.baomidou.global.BaseService//.superServiceImplClass()//设置 service 实现类父类 : BaseServiceImpl.class || com.baomidou.global.BaseServiceImpl.formatServiceFileName("%sService")//格式化 service 接口文件名称.formatServiceImplFileName("%sServiceImpl")//格式化 service 实现类文件名称.mapperBuilder()//.superClass()//设置父类: BaseMapper.class || com.baomidou.global.BaseMapper.enableMapperAnnotation()//开启 @Mapper 注解,默认值:false.enableBaseResultMap() //启用 BaseResultMap 生成,默认值:false.enableBaseColumnList() //启用 BaseColumnList,默认值:false//.convertXmlFileName().formatMapperFileName("%sMapper")//格式化 mapper 文件名称.formatXmlFileName("%sMapper");//格式化 xml 实现类文件名称//当表名中带*号时可以启用通配符模式if (tableNames.length == 1 && tableNames[0].contains("*")) {String[] likeStr = tableNames[0].split("_");String likePrefix = likeStr[0] + "_";builder.likeTable(new LikeTable(likePrefix));} else {builder.addInclude(tableNames);}return builder.build();}}

2.3、自定义模板引擎

package config;import com.baomidou.mybatisplus.generator.config.OutputFile;import com.baomidou.mybatisplus.generator.config.po.TableInfo;import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;import java.io.File;import java.util.Map;public class TimerVelocityTemplateEngine extends VelocityTemplateEngine {@Overrideprotected void outputCustomFile(Map<String, String> customFile, TableInfo tableInfo, Map<String, Object> objectMap) {//数据库表映射实体名称String entityName = tableInfo.getEntityName();String otherPath = this.getPathInfo(OutputFile.other);//System.out.println(JsonUtils.toJSONString(tableInfo));//数据库表映射实体名称 驼峰命名法objectMap.put("humpEentityName",toLowerCaseFirstOne(entityName));customFile.forEach((key, value) -> {String fileName = String.format(otherPath + File.separator +key,entityName);this.outputFile(new File(fileName), objectMap, value);});}/*** 首字母转为小写* @param s* @return*/private String toLowerCaseFirstOne(String s){if(Character.isLowerCase(s.charAt(0))) {return s;}else {return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();}}}

2.4、运行结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。