网站开发的软件环境,wordpress行业模版,信息产业部网站备案系统,手机靓号网站制作文章目录 mybatis-plus使用一、依赖引入二、添加相关配置项三、功能详解1.自增主键2.逻辑删除3.操作时间自动填充4.其他字段自动填充5.分页查询6.自定义动态查询7.代码生成器8.代码生成器(自定义模板) mybatis-plus使用
一、依赖引入
pom.xml文件
?xml version1.… 文章目录 mybatis-plus使用一、依赖引入二、添加相关配置项三、功能详解1.自增主键2.逻辑删除3.操作时间自动填充4.其他字段自动填充5.分页查询6.自定义动态查询7.代码生成器8.代码生成器(自定义模板) mybatis-plus使用
一、依赖引入
pom.xml文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.4/versionrelativePath//parentartifactIdmybatis-plus-demo/artifactIddependencies!-- 实现对数据库连接池的自动化配置 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependencydependency !-- 本示例我们使用 MySQL --groupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.48/version/dependency!-- 实现对 MyBatis Plus 的自动化配置 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.2.0/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency/dependencies/project二、添加相关配置项
application.yaml
spring:# datasource 数据源配置内容datasource:url: jdbc:mysql://127.0.0.1:3306/test-user?useSSLfalseuseUnicodetruecharacterEncodingUTF-8driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: root1234三、功能详解
1.自增主键
CREATE TABLE auto_increment (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键,name VARCHAR(100) NOT NULL COMMENT 名称,create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间
) COMMENT主键自增表;表单说明在数据库软件如navicat中直接插入数据时数据呈现主键自增情况但使用mybatis-plus直接插入数据则不会。 1直接为实体id字段添加注解TableId(type IdType.AUTO)加上此注解后插入的数据就可以实现主键自增了。 实体类如下
TableName(value auto_increment)
Data
public class AutoIncrementDO {TableId(type IdType.AUTO)private Long id;private String name;private LocalDateTime createTime;
}2全局配置在配置文件中加入以下配置
mybatis-plus:global-config:db-config:id-type: auto # 全局主键策略实体类如下
TableName(value auto_increment)
Data
public class AutoIncrementDO {// 字段名id时会自动识别为主键否则需要加上 TableId 注解private Long id;private String name;private LocalDateTime createTime;
}ps:数据库主键必须设置为自增否则会报错
2.逻辑删除
CREATE TABLE logic_delete (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键,name VARCHAR(50) NOT NULL COMMENT 名称,create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间,deleted BIT NOT NULL DEFAULT FALSE COMMENT 是否删除
) COMMENT逻辑删除表;
表单说明deleted字段默认设为false即0删除数据时值需要将deleted字段置为1即可不需要真正的删除数据。
mybatis-plus如何实现这一需求呢 1直接在表示逻辑删除的字段上添加注解TableLogic即可默认值为0删除值为1若想反过来需要自定义TableLogic(value 1, delval 0)或者TableLogic(value false, delval true) 2全局配置表示删除的字段上添加注解TableLogic全局配置默认值和删除值配置如下。
mybatis-plus:global-config:db-config:logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)logic-delete-value: 1 # 逻辑已删除值(默认为 1)ps:若字段上的注解不仅仅为TableLogic而是例如TableLogic(value 1, delval 0)等情况那么该表的逻辑删除按该注解来即该表0表示删除
3.操作时间自动填充
CREATE TABLE auto_update_time (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 主键,content VARCHAR(255) NOT NULL COMMENT 名称,create_time TIMESTAMP DEFAULT NULL COMMENT 创建时间,update_time TIMESTAMP DEFAULT NULL COMMENT 更新时间
)COMMENT时间自动更新表;表单说明为不产生影响数据库中创建时间与更新时间不设置默认值也不自动更新。
mybatis-plus实现操作时间自动填充以及更新步骤如下 ①字段上添加如下注解
Data
TableName(auto_update_time)
public class AutoUpdateTimeDO {TableId(type IdType.AUTO)private Long id;private String content;TableField(fill FieldFill.INSERT)private LocalDateTime createTime;TableField(fill FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;
}②实现 MetaObjectHandler 接口
Component
public class DefaultDBFieldHandler implements MetaObjectHandler {Overridepublic void insertFill(MetaObject metaObject) {setInsertFieldValByName(createTime, LocalDateTime.now(), metaObject);setInsertFieldValByName(updateTime, LocalDateTime.now(), metaObject);}Overridepublic void updateFill(MetaObject metaObject) {setUpdateFieldValByName(updateTime, LocalDateTime.now(), metaObject);}
}4.其他字段自动填充
如创建人与更新人自动填充这里会和创建时间以及更新时间自动填充一起二者实现都需要实现MetaObjectHandler接口。 实现如下 ①字段上添加如下注解
Data
TableName(value auto_fill_operator)
public class AutoFillOperatorDO extends BaseDO{TableId(type IdType.AUTO)private Long id;private String content;
}Data
public class BaseDO {TableField(fill FieldFill.INSERT)private String creator;TableField(fill FieldFill.INSERT_UPDATE)private String updater;TableField(fill FieldFill.INSERT)private LocalDateTime createTime;TableField(fill FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;
}②实现 MetaObjectHandler 接口
Component
public class DefaultDBFieldHandler implements MetaObjectHandler {Overridepublic void insertFill(MetaObject metaObject) {if (metaObject.getOriginalObject() instanceof BaseDO) {BaseDO baseDO (BaseDO) metaObject.getOriginalObject();LocalDateTime current LocalDateTime.now();// 创建时间为空则填充当前时间if (Objects.isNull(baseDO.getCreateTime())) {baseDO.setCreateTime(current);}// 更新时间为空则填充当前时间if (Objects.isNull(baseDO.getUpdateTime())) {baseDO.setUpdateTime(current);}String user creator;// 创建人为空则填充当前用户if (Objects.isNull(baseDO.getCreator())) {baseDO.setCreator(user);}// 更新人为空则填充当前用户if (Objects.isNull(baseDO.getUpdater())) {baseDO.setUpdater(user);}}}Overridepublic void updateFill(MetaObject metaObject) {// 更新时间为空则以当前时间为更新时间Object modifyTime getFieldValByName(updateTime, metaObject);if (Objects.isNull(modifyTime)) {setFieldValByName(updateTime, LocalDateTime.now(), metaObject);}// 当前登录用户不为空更新人为空则当前登录用户为更新人Object modifier getFieldValByName(updater, metaObject);String user updater;if (Objects.isNull(modifier)) {setFieldValByName(updater, user, metaObject);}}
}5.分页查询
Mapper
public interface CrudBaseMaoper extends BaseMapperCrudBaseDO {
}Service
public class CrudBaseServiceImpl {Resourceprivate CrudBaseMaoper crudBaseMaoper;public IPageCrudBaseDO page(String name) {// 构造分页参数PageCrudBaseDO page new Page(1, 10); // 当前页, 每页显示条数QueryWrapperCrudBaseDO queryWrapper new QueryWrapper();queryWrapper.lambda().like(CrudBaseDO::getCompanyName, name);return crudBaseMaoper.selectPage(page, queryWrapper);}分页查询total为0需要配置分页插件如下
Configuration
public class MybatisPlusConfig {// 分页查询拦截器可以获取total值Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 根据数据库类型选择return interceptor;}
}6.自定义动态查询
场景在数据库查询中经常遇到需要根据多个可选字段进行动态查询的情况。传统写法需要为每个字段编写判空逻辑代码冗长且重复。 通过自定义 LambdaQueryWrapper 扩展方法实现简洁的动态查询 示例
public class LambdaQueryWrapperXT extends LambdaQueryWrapperT {public LambdaQueryWrapperXT likeIfPresent(SFunctionT, ? column, String val) {if (StringUtils.hasText(val)) {return (LambdaQueryWrapperXT) super.like(column, val);}return this;}
}Mapper
public interface CrudProMapper extends BaseMapperCrudProDO {
}Service
public class CrudProServiceImpl implements CrudProService {Resourceprivate CrudProMapper crudProMapper;Overridepublic IPageCrudProDO getCrudProPage(CrudProPageReqVO reqVO) {IPageCrudProDO page new Page(1, 10);return crudProMapper.selectPage(page, new LambdaQueryWrapperXCrudProDO().likeIfPresent(CrudProDO::getCompanyName, reqVO.getCompanyName()).likeIfPresent(CrudProDO::getCompanyCode, reqVO.getCompanyCode()));}
}其他方法也可以一样的实现比如eqIfPresent
7.代码生成器
1相关依赖 !-- 实现对 MyBatis Plus 的自动化配置 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version/dependency!-- 代码自动生成器--!-- 与mybatis-plus版本保持一致--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-generator/artifactIdversion3.5.3.1/version/dependency!-- 模板引擎依赖默认使用 Velocity --dependencygroupIdorg.apache.velocity/groupIdartifactIdvelocity-engine-core/artifactIdversion2.3/version/dependencydependencygroupIdorg.freemarker/groupIdartifactIdfreemarker/artifactId/dependency2生成器代码
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.util.Collections;public class CodeGenerator {public static void main(String[] args) {// 多模块地址前缀没有可不写String prefixPath /kaishu-sql-crud/kaishu-sql-crud-mybatis-plus-pro/;FastAutoGenerator.create(jdbc:mysql://127.0.0.1:3306/test-user?useSSLfalseuseUnicodetruecharacterEncodingUTF-8,root,root1234).globalConfig(builder - {builder.author(kaishu) // 设置作者.outputDir(System.getProperty(user.dir) prefixPath /src/main/java) // 输出目录.enableSwagger() // 开启swagger.fileOverride(); // 覆盖已生成文件}).packageConfig(builder - {builder.parent(org.kaishu.sql.crud.mybatis.plus.pro) // 设置父包名.moduleName(generatordemo) // 设置父包模块名.pathInfo(Collections.singletonMap(OutputFile.xml,System.getProperty(user.dir) prefixPath /src/main/resources/mapper)); // 设置mapperXml路径}).strategyConfig(builder - {builder.addInclude(t_auto_genarater, t_test_auto_genarater) // 设置需要生成的表名.addTablePrefix(t_, t_) // 设置过滤表前缀.entityBuilder() // 实体类配置.enableLombok() // 启用Lombok.controllerBuilder() // Controller配置.enableRestStyle() // 启用RestController.mapperBuilder() // Mapper配置.enableMapperAnnotation(); // 启用Mapper}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎.execute();}
}更详细的配置参考如下 1实体类生成配置
.strategyConfig(builder - {builder.entityBuilder().enableLombok() // 使用Lombok.enableChainModel() // 链式模型.enableRemoveIsPrefix() // 移除is前缀.enableTableFieldAnnotation() // 字段注解.versionColumnName(version) // 乐观锁字段名.logicDeleteColumnName(deleted) // 逻辑删除字段名.naming(NamingStrategy.underline_to_camel) // 命名策略.columnNaming(NamingStrategy.underline_to_camel).addSuperEntityColumns(id, create_time, update_time) // 公共字段.formatFileName(%sEntity) // 文件名称格式.addIgnoreColumns(is_deleted); // 忽略字段
})2Mapper生成配置
.strategyConfig(builder - {builder.mapperBuilder().enableBaseResultMap() // 生成resultMap.enableBaseColumnList() // 生成columnList.enableMapperAnnotation() // Mapper注解.formatMapperFileName(%sDao) // Mapper文件命名.formatXmlFileName(%sXml); // Xml文件命名
})3Service生成配置
.strategyConfig(builder - {builder.serviceBuilder().formatServiceFileName(%sService) // Service接口命名.formatServiceImplFileName(%sServiceImpl); // Service实现类命名
})4Controller生成配置
.strategyConfig(builder - {builder.controllerBuilder().enableRestStyle() // 使用RestController.enableHyphenStyle() // 使用驼峰转连字符.formatFileName(%sController) // 文件命名.enableFileOverride(); // 覆盖已生成文件
})8.代码生成器(自定义模板)
示例这里只自定义实体类生成模板其余照旧这里我需要让实体类都继承我已定义好的的类BaseDO
1依赖同上 2生成器代码基本同上
.strategyConfig(builder - {...
})
// 加上这行代码即可
.templateConfig(builder - {builder.entity(/templates/custom-entity.java);})2自定义实体模板文件在\src\main\resources\templates\目录下新建custom-entity.java.ftl文件文件内容如下
package ${package.Entity};#-- 基础导入 --
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.EqualsAndHashCode;
#-- 导入项目基础类 --
import org.kaishu.sql.crud.mybatis.plus.pro.dal.dataobject.BaseDO;#-- 类注释 --
/**
* ${table.comment!} 实体类
*
* author ${author}
* since ${date}
*/
Data
EqualsAndHashCode(callSuper true)
TableName(${table.name})
public class ${entity} extends BaseDO {private static final long serialVersionUID 1L;#-- 生成字段自动排除BaseDO中已存在的字段 --
#list table.fields as field#if ![id,create_time,update_time,creator,updater,deleted]?seq_contains(field.name)/*** ${field.comment!}*/TableField(${field.name})private ${field.propertyType} ${field.propertyName};/#if
/#list
}·