1、pom.xml引入mybatis-plus依赖
<!-- mybatis-plus 增强CRUD -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!-- mybatis-plus代码自动生成 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
2、application.yml引入MyBatis Plus配置
# MyBatis Plus配置
mybatis-plus:
# 搜索指定包别名
typeAliasesPackage: com.new3s.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
3、使用代码生成器,自动生成***Entity.java、***Controller.java、I***Service.java、***ServiceImp.java、***Mapper.java、***Mapper.xml文件。
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/**
* mybatis-plus代码生成器
*
* @author kally
* @date 2023/5/29
*/
public class CodeGenerator {
/**
* 测试方法
*
* @param args
*/
public static void main(String[] args) {
// 需要构建一个 代码自动生成器 对象
AutoGenerator mpg = new AutoGenerator();
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://192.168.***.***:3306/***DB?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("***");
dsc.setPassword("******");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
projectPath = projectPath.concat("/windPvElecIntg-modules/new3s-windinspection");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("kally");
gc.setOpen(false);
gc.setFileOverride(true);
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
gc.setIdType(IdType.AUTO);
gc.setActiveRecord(true);
gc.setEntityName("%sEntity");
gc.setMapperName("%sMapper");
gc.setServiceName("I%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setControllerName("%sController");
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
// 包配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setModuleName("projectname");
packageConfig.setParent("com.companyname");
packageConfig.setEntity("domain");
packageConfig.setMapper("mapper");
packageConfig.setXml("mapper");
packageConfig.setService("service");
packageConfig.setServiceImpl("service.impl");
packageConfig.setController("controller");
mpg.setPackageInfo(packageConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// 对那一张表生成代码
strategy.setInclude("wind_defect_config");
// 数据库表映射到实体的命名策略
strategy.setNaming(NamingStrategy.underline_to_camel);
// 生成实体时去掉表前缀
// strategy.setTablePrefix("wind_", "pv_", "sys_");
// 数据库表字段映射到实体的命名策略
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setEntityLombokModel(true);
// restful api风格控制器
strategy.setRestControllerStyle(true);
// url中驼峰转连字符
strategy.setControllerMappingHyphenStyle(true);
// 唯一标识
strategy.setEntitySerialVersionUID(true);
// 设置超类
strategy.setSuperMapperClass("com.baomidou.mybatisplus.core.mapper.BaseMapper");
strategy.setSuperServiceClass("com.baomidou.mybatisplus.extension.service.IService");
strategy.setSuperServiceImplClass("com.baomidou.mybatisplus.extension.service.impl.ServiceImpl");
mpg.setStrategy(strategy);
// 模板配置
TemplateConfig templateConfig = new TemplateConfig();
// 代码生成器
mpg.setGlobalConfig(gc);
mpg.setPackageInfo(packageConfig);
mpg.setStrategy(strategy);
mpg.setTemplate(templateConfig);
mpg.execute();
}
}
4、注意:mybatis-plus框架会自动处理表的create***和update***字段。
如:create_time、update_time
解决方案:添加mp元数据注入处理器,针对不是数据库字段加排除处理
给mybtais-plus 注入处理器
package com.new3s.common.framework.mybatis;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.new3s.common.core.baseweb.domain.BaseEntity;
import com.new3s.common.core.constant.HttpStatus;
import com.new3s.common.core.exception.ServiceException;
import com.new3s.common.core.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
/**
* @Description mybtais-plus 注入处理器
* @Date 2023-05-31
* @Author kally
*/
@Slf4j
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
if (StringUtils.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();
Date current = StringUtils.isNotNull(baseEntity.getCreateTime())
? baseEntity.getCreateTime() : new Date();
baseEntity.setCreateTime(current);
baseEntity.setUpdateTime(current);
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.UNAUTHORIZED);
}
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (StringUtils.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();
Date current = new Date();
// 更新时间填充(不管为不为空)
baseEntity.setUpdateTime(current);
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.UNAUTHORIZED);
}
}
}
/**
* Mybatis Plus 配置
*
* @author kally
*/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig {
/**
* 元对象字段填充控制器
*/
@Bean
public MetaObjectHandler metaObjectHandler() {
return new CreateAndUpdateMetaObjectHandler();
}
}