Appearance
springboot集成
- 依赖
shell
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.12</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser</artifactId>
<version>3.5.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool.v7</groupId>
<artifactId>hutool-all</artifactId>
<version>7.0.0-M1</version>
</dependency>
<dependency>
<groupId>com.github.f4b6a3</groupId>
<artifactId>uuid-creator</artifactId>
<version>6.1.1</version>
</dependency>
- 配置文件
shell
### mybatis plus ###
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.global-config.db-config.id-type=assign_uuid
mybatis-plus.global-config.banner=false
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
MpConfig.java
shell
/**
* mybatis-plus配置
*/
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//分页插件-在使用多个插件时,请将分页插件放到插件执行链的最后面,以避免 COUNT SQL 执行不准确的问题
interceptor.addInnerInterceptor(paginationInnerInterceptor());
return interceptor;
}
/**
* 分页插件,自动识别数据库类型
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit(-1L);
// 分页合理化
paginationInnerInterceptor.setOverflow(false);
return paginationInnerInterceptor;
}
}
MpMetaObjectHandler.java
shell
/**
* 处理自动更新的字段
*/
@Component
public class MpMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
setFieldValByName("createTime", new Date(), metaObject);
if (metaObject.getOriginalObject() instanceof BizBaseEntity bizBaseEntity) {
setFieldValByName("delFlag", "0", metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
if (metaObject.getOriginalObject() instanceof BizBaseEntity bizBaseEntity) {
setFieldValByName("updateTime", new Date(), metaObject);
}
}
}
MpUuidV7Generator.java
shell
/**
* v7版本uuid
*/
@Component
public class MpUuidV7Generator implements IdentifierGenerator {
@Override
public Number nextId(Object entity) {
return IdUtil.getSnowflakeNextId();
}
@Override
public String nextUUID(Object entity) {
UUID uuid = UuidCreator.getTimeOrderedEpoch();
return StrUtil.replace(uuid.toString(), "-", "");
}
}
BaseEntity.java
shell
@Getter
@Setter
@MappedSuperclass
public class BaseEntity {
@Id
@Column(length = 32)
private String id;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(columnDefinition = "datetime COMMENT '创建时间'")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@JsonIgnore
@Column(length = 32, updatable = false)
@Comment("创建人")
@TableField(fill = FieldFill.INSERT)
private String createBy;
}
BizBaseEntity.java
shell
@Getter
@Setter
@MappedSuperclass
public class BizBaseEntity extends BaseEntity {
@JsonIgnore
@Column(length = 1, columnDefinition = "char(1) default '0'")
@Comment("删除标识,0-正常,1-删除")
private String delFlag;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(columnDefinition = "datetime COMMENT '创建时间'")
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
@JsonIgnore
@Column(length = 32, updatable = false)
@Comment("创建人")
@TableField(fill = FieldFill.UPDATE)
private String updateBy;
}
mp常用注解
@TableName
:指定实体类对应的数据库表名。当实体类名与数据库表名不一致,或者实体类名不是数据库表名的驼峰写法时,需要使用这个注解来明确指定表名。excludeProperty
:指定在映射时需要排除的属性名。这些属性将不会被包含在生成的 SQL 语句中
@TableId
:用于标记实体类中的主键字段。如果主键字段名为 id,可以省略这个注解type
:指定主键的生成策略(IdType.AUTO、IdType.NONE、IdType.INPUT、IdType.ASSIGN_ID、IdType.ASSIGN_UUID)
@TableField
:用于标记实体类中的非主键字段,实体类字段名遵循驼峰命名规则,并且与数据库表字段名一致,可以省略这个注解value
:指定数据库中的字段名,如果实体类字段名与数据库字段名不同,使用这个属性来指定正确的数据库字段名。exist
:指示这个字段是否存在于数据库表中。如果设置为 false,在生成 SQL 时会忽略这个字段。condition
:指定字段的条件表达式。自定义字段在WHERE子句中的比较方式,无值则默认为全局的%s=#{%s}
fill
:字段自动填充策略。用于指定在执行数据库操作(如插入、更新)时,如何自动填充字段的值。通过使用FieldFill枚举控制字段的填充行为select
:在执行查询操作时,该字段是否应该包含在 SELECT 语句中
@Version
:用于标记实体类中的字段作为乐观锁版本号字段
wrapper使用
java
LambdaQueryWrapper<SysTest> lqw = Wrappers.lambdaQuery(SysTest.class).eq(SysTest::getId, "2");
// 仅获取一条数据
wrapper.last("limit 1");
//特殊处理字段
SysTest target = BeanUtil.copyProperties(test, new SysTest(), "id");
LambdaQueryWrapper<SysTest> lqw = Wrappers.lambdaQuery(target);
lqw.like(StrUtil.isNotEmpty(test.getId()), SysTest::getId, test.getId());
Page<SysTest> page = sysTestService.page(lqw);
其他
- 排除字段
shell
private transient String noColumn;
- Map下划线自动转驼峰
shell
@Configuration
public class MybatisConfigurationCustomizer {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setObjectWrapperFactory(new MybatisMapWrapperFactory());
}
}