Mybatis-plus配置
导入pom依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--连接池-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
<scope>runtime</scope>
</dependency>
新建一个MybatisPlusConfig.java文件
@EnableTransactionManagement // 事物管理 @Configuration public class MyBatisPlus { // 乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); } // 分页插件 @Bean public PaginationInterceptor paginationInterceptor(){ return new PaginationInterceptor(); } // 逻辑删除配置 @Bean public ISqlInjector iSqlInjector(){ return new LogicSqlInjector(); } // sql 效率插件 @Bean @Profile({"dev","test"}) public PerformanceInterceptor performanceInterceptor(){ PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTime(1000); // ms 最大执行时间超过不执行 performanceInterceptor.setFormat(true); // 是否开启格式化支持 return performanceInterceptor; } }
在来点mybatis-plus的跟新策略
@Slf4j @Component public class MyMeteObject implements MetaObjectHandler { // 插入时的跟新策略 @Override public void insertFill(MetaObject metaObject) { log.info("stats info hander....."); this.setFieldValByName("createTime", new Date(), metaObject); this.setFieldValByName("updateTime", new Date(), metaObject); } // 修改时的跟新策略 @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime", new Date(), metaObject); } }
在启动类中扫描resources下的mapper文件
在application.properties文件添加数据库和mybatis-plus配置
# mysql配置 mysql 8 版本需要配置时区 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/dome?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC # 配置当前版本 开发环境 #spring.profiles.active=dev # redis配置 #spring.redis.host=127.0.0.1 #spring.redis.port=6379 #数据库配置日志 使用控制台输出 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl #配置逻辑删除 mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0
关键来了,mybatis给我们提供的代码自动生成器。在test中新建一个MybatisGenertot文件,它可以帮助我们根据数据库自动生成controller,service.....等基本代码。
1. 先添加自动生成依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
2.新建一个带有main方法的类public class GeneratorCode
package com.dome.common.utils.generator;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Scanner;
/**
* @author auth
* @date 2020/11/25 10:52
* 生成代码
*/
public class GeneratorCode {
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入" + tip + ":");
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
AutoGenerator autoGenerator = new AutoGenerator();
//全局配置
GlobalConfig gc = new GlobalConfig();
//得到当前项目的路径
String oPath = System.getProperty("user.dir");
gc.setOutputDir(oPath + "/src/main/java");
//生成完成后不弹出文件框
gc.setOpen(false);
//文件覆盖
gc.setFileOverride(true);
// ActiveRecord特性
gc.setActiveRecord(false);
gc.setEnableCache(false);
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
// 作者
gc.setAuthor("auth");
gc.setSwagger2(true);
// 自定义文件命名,注意 %s 会自动填充表实体属性!
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
autoGenerator.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("yourpass");
dsc.setUrl("jdbc:mysql://localhost:3306/sprin_security?useSSL=false&useUnicode=true&nullCatalogMeansCurrent=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");
autoGenerator.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
//父包路径
pc.setParent("com.dome.cm");
String s = "." + scanner("包名称");
pc.setController("controller" + s);
pc.setService("service" + s);
pc.setServiceImpl("service" + s);
pc.setMapper("mapper" + s);
pc.setXml("mapper" + s);
pc.setEntity("po" + s);
autoGenerator.setPackageInfo(pc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// 表名生成策略
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
// 需要生成的表
strategy.setInclude(scanner("表名称").split(","));
strategy.setSuperServiceClass(null);
strategy.setSuperServiceImplClass(null);
strategy.setSuperMapperClass(null);
//去除表前缀
strategy.setTablePrefix("sys_", "sw_");
//去除字段前缀
strategy.setFieldPrefix("");
// 填充策略
strategy.setLogicDeleteFieldName("del_flag");
TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(createTime);
tableFills.add(updateTime);
strategy.setTableFillList(tableFills);
strategy.setVersionFieldName("version");
strategy.setRestControllerStyle(true);
autoGenerator.setStrategy(strategy);
// 执行生成
autoGenerator.execute();
}
}
3.执行main方法输入数据库表名 回车。
4.这里提供一个多模块结构的
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.core.toolkit.StringPool; 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.TableFill; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import org.apache.commons.lang3.StringUtils; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @author yxw * @date 2021/11/25 10:52 * 生成代码 */ public class GeneratorCode { private static final String[] MODELS = {"com-dome-biz", "com-dome-model", "com-dome-provider"}; public static void main(String[] args) { String modelName = "." + scanner("包名称"); String[] tableNames = scanner("表名称,多个用','间隔").split(","); for (String model : MODELS) { shell(model, modelName, tableNames, "author"); } } /** * 生成代码 * @param model 項目名稱 * @param modelName 包名称 * @param tableNames 表名称 * @param author 作者 */ public static void shell(String model, String modelName, String[] tableNames, String author) { String path = getPath(model); AutoGenerator autoGenerator = new AutoGenerator(); //全局配置 GlobalConfig gc = new GlobalConfig(); //得到当前项目的路径 gc.setOutputDir(path + "/src/main/java"); //生成完成后不弹出文件框 gc.setOpen(false); //文件覆盖 gc.setFileOverride(true); // ActiveRecord特性 gc.setActiveRecord(false); gc.setEnableCache(false); gc.setBaseResultMap(true); gc.setBaseColumnList(true); // 作者 gc.setAuthor(author); gc.setSwagger2(true); // 自定义文件命名,注意 %s 会自动填充表实体属性! gc.setControllerName("%sController"); gc.setServiceName("%sService"); gc.setServiceImplName("%sServiceImpl"); gc.setMapperName("%sMapper"); gc.setXmlName("%sMapper"); autoGenerator.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setDbType(DbType.MYSQL); /// 自定义数据库表字段类型转换 // dsc.setTypeConvert(new MySqlTypeConvert(){ // @Override // public IColumnType processTypeConvert(GlobalConfig globalConfig, TableField tableField) { // return null; // } // }); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("LBKJmysql@"); dsc.setUrl("jdbc:mysql://sh-cdb-2i9lbldy.sql.tencentcdb.com:59810/farm_yx?useSSL=false&useUnicode=true&nullCatalogMeansCurrent=true&characterEncoding=UTF-8&serverTimezone=GMT"); autoGenerator.setDataSource(dsc); // 包配置 PackageConfig pc = packageConfig(modelName); autoGenerator.setPackageInfo(pc); /// 自定义配置 (使用模板引擎,需要把mybatis-plus自带的生成功能关闭) // if (StringUtils.equals(model, MODELS[0])) { // InjectionConfig cfg = templateConfig(path, modelName); // autoGenerator.setCfg(cfg); // } // 关闭默认 xml 生成,调整生成 至 根目录 TemplateConfig tc = allocation(new TemplateConfig(), model); autoGenerator.setTemplate(tc); // 策略配置 StrategyConfig strategy = strategyConfig(new StrategyConfig(), tableNames); autoGenerator.setStrategy(strategy); // 执行生成 autoGenerator.execute(); } /** * 多項目的包配置 * @param modelName * @return */ private static PackageConfig packageConfig(String modelName) { PackageConfig pc = new PackageConfig(); // **不同的項目包路徑也需要更改 pc.setParent(null); pc.setController(replace(MODELS[2], "-", ".") + ".controller" + modelName); pc.setService(replace(MODELS[0], "-", ".") + ".service" + modelName); pc.setServiceImpl(replace(MODELS[0], "-", ".") + ".service" + modelName); pc.setMapper(replace(MODELS[0], "-", ".") + ".mapper" + modelName); pc.setXml(replace(MODELS[0], "-", ".") + ".mapper" + modelName); pc.setEntity(replace(MODELS[1], "-", ".") + ".po" + modelName); return pc; } /** * 模板配置 * @param path * @param modelName * @return */ private static InjectionConfig templateConfig(String path, String modelName) { InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; /// 如果模板引擎是 freemarker // String templatePath = "/templates/mapper.xml.ftl"; // 如果模板引擎是 velocity String templatePath = "/templates/mapper.xml.vm"; // 自定义输出配置 List<FileOutConfig> focList = new ArrayList<>(); // 自定义配置会被优先输出 focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! return path + "/src/main/resources/mapper/" + lastSplit(modelName, ".") + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); cfg.setFileOutConfigList(focList); return cfg; } /** * 生成代碼策略 * @param strategy * @param tableNames * @return */ private static StrategyConfig strategyConfig(StrategyConfig strategy, String[] tableNames) { // 表名生成策略 strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); // 需要生成的表 strategy.setInclude(tableNames); /// 自己的父类实体,没有就不用设置! // strategy.setSuperServiceClass(null); // strategy.setSuperServiceImplClass(null); // strategy.setSuperMapperClass(null); //去除表前缀 strategy.setTablePrefix("sys_", "sw_", "zzl_", "tx_", "xqd_"); //去除字段前缀 strategy.setFieldPrefix(""); // 填充策略 strategy.setLogicDeleteFieldName("is_delete"); TableFill createTime = new TableFill("create_time", FieldFill.INSERT); TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE); ArrayList<TableFill> tableFills = new ArrayList<>(); tableFills.add(createTime); tableFills.add(updateTime); strategy.setTableFillList(tableFills); strategy.setVersionFieldName("version"); strategy.setRestControllerStyle(true); return strategy; } /** * 項目文件分配 * @param tc * @param model * @return */ private static TemplateConfig allocation(TemplateConfig tc, String model) { if (StringUtils.equals(MODELS[0], model)) { tc.setController(null); tc.setEntity(null); } else if (StringUtils.equals(MODELS[1], model)) { tc.setController(null); tc.setMapper(null); tc.setService(null); tc.setServiceImpl(null); tc.setXml(null); } else if (StringUtils.equals(MODELS[2], model)) { tc.setMapper(null); tc.setService(null); tc.setServiceImpl(null); tc.setEntity(null); tc.setXml(null); } return tc; } /** * 读取控制台输入信息 * @param tip * @return */ private static String scanner(String tip) { Scanner scanner = new Scanner(System.in); System.out.println("请输入" + tip + ":"); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotEmpty(ipt)) { return ipt; } } throw new MybatisPlusException("请输入正确的" + tip + "!"); } /** * 获得项目路径 * @param model * @return */ private static String getPath(String model) { File file = new File(model); String path = file.getAbsolutePath(); return path; // return path.substring(0, path.lastIndexOf(File.separator)); } /** * 判断文件是否存在 * @param path 路径 * @return */ private static boolean isExists(String path) { File file = new File(path); return file.exists(); } /** * 删除文件 * @param path */ private static void delFile(String path) { File file = new File(path); if (file.exists()) { file.delete(); } } /** * 替換字符 * @param name * @param a * @param b * @return */ private static String replace(String name, String a, String b) { return name.replace(a, b); } /** * 根据标识截取字符串 * @param str * @param tab * @return */ private static String lastSplit(String str, String tab) { return StringUtils.isEmpty(str) ? null : str.substring(str.lastIndexOf(tab) + 1, str.length()); } }