Skip to content

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());
    }
}