mybatis-plus 总结

mybatis-plus 3.4.0版本使用总结

通用实体类的定义

  1. 创建BaseEntity 通用实体类,定义所有实体类公用的属性
@Data
public class BaseEntity<T> {
    @TableId(type = IdType.AUTO)      
    private Long id;

    @Version
    private Integer version;

    @TableLogic
    private Integer deleted;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}
  1. 自己编写的实体类需要继承BaseEntity
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class User extends BaseEntity {

    private String name;
    private Integer age;
    private String email;
}
  • 注意: @EqualsAndHashCode(callSuper = true) 不加该注解的影响,子类对象属性值一致,但其继承的父类对象属性值不一致,在比较的时候会出现比较结果不对的情况。

Mapper CRUD接口

  1. 创建自定义的通用BaseMapper接口。同时 extends mybatis-plus提供的基类 com.baomidou.mybatisplus.core.mapper.BaseMapper
public interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {
}
  1. mapper层的定义举例
    • 自己编写的接口实现自定义的BaseMapper接口,泛型为自己相对应的实体类。
    • Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器。
    public interface UserMapper extends BaseMapper<User> {
    }
    

Service CRUD接口

  1. 创建通用的基本包路径

  2. 创建自定义的通用IService接口。同时 extends mybatis-plus提供的基类 com.baomidou.mybatisplus.extension.service.IService

public interface IService<T> extends com.baomidou.mybatisplus.extension.service.IService<T> {
}
  1. 创建自定义的通用ServiceImpl类,可以自定义自己的通用Service方法。同时 extends mybatis-plus提供的基类 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl<M, T>
public class ServiceImpl<M extends BaseMapper<T>, T extends BaseEntity> extends com.baomidou.mybatisplus.extension.service.impl.ServiceImpl<M, T> {
}
  1. service 层的定义举例
    • service层的接口继承自己自定义的通用IService接口
    public interface UserService extends IService<User> {
    }
    
    • impl层实现类继承自定义的ServiceImpl类,同时实现相应的接口,编写自己的业务代码。
    @Service
    @Transactional
    @Slf4j
    public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    }
    

乐观锁的使用

  1. 数据库增加version字段,默认为1。

  2. entity实体类中乐观锁属性加@Version注解。

  3. 注册相应的拦截器并纳入容器。

    @Bean
    public MybatisPlusInterceptor MybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //乐观锁
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
  1. 执行结果分析

分页插件的使用

  1. 分页插件拦截器配置
@Configuration
@EnableTransactionManagement         //开启事务
@MapperScan("org.example.mapper")    //扫描mapper文件夹
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor MybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //分页配置
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
  1. 测试案例
    //分页查询
    @Test
    public void testSelectByPage() {
        Page<User> page = new Page<>(1,5);
        userMapper.selectPage(page, null);
        List<User> records = page.getRecords();
        records.forEach(System.out::println);
        System.out.println(page.getTotal());
    }

逻辑删除的使用

  1. 数据库添加逻辑删除的相应字段
  2. 在spring boot 的yml文件中配置
  ##配置逻辑删除
  global-config:
    db-config:
      logic-delete-value: 1               //删除为1
      logic-not-delete-value: 0           //不删除为0
  1. 实体类上加@TableLogic注解

字段自动填充功能

  1. 比如需要自动添加到数据库创建时间,更新时间,创建人,更新人等。数据库添加相应字段。
  2. 实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
/**
 * 公共字段填充
 * @author linpz
 */
@Component
public class CustomMetaObjectHandler implements MetaObjectHandler {
    
    @Autowired
    PermissionContext permissionContext;

    /**
     * 插入元对象字段填充(用于插入时对公共字段的填充)
     * @param metaObject 元对象
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        TokenDTO currentToken = permissionContext.getCurrentUserToken();
        LocalDateTime now = LocalDateTime.now();
        if(currentToken != null) {
            setFieldValByName("creator", currentToken.getUserId(), metaObject);
            setFieldValByName("updator", currentToken.getUserId(), metaObject);
        }
        setFieldValByName("createTime", now, metaObject);
        setFieldValByName("updateTime", now, metaObject);
    }

    /**
     * 更新元对象字段填充(用于更新时对公共字段的填充)
     * @param metaObject 元对象
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        TokenDTO currentToken = permissionContext.getCurrentUserToken();
        if(currentToken != null) {
            setFieldValByName("updator", currentToken.getUserId(), metaObject);
        }
        setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
}
  1. 实体类相应属性加注解
    @TableField(value = "creator_", fill = FieldFill.INSERT)
    private String creator;

    @TableField(value = "create_time_", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(value = "updator_", fill = FieldFill.INSERT_UPDATE)
    private String updator;

    @TableField(value = "update_time_", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

主键填充策略

  1. 数据库主键id必须为自增,否则报错。

  2. 实体类增加注解
    @TableId(type = IdType.AUTO)      //AUTO为主键自增  
                                      //ID_WORKER为全局唯一id,使用mybatis-plus插入会使用雪花算法自动生成long型的唯一id,回填到id字段中。具体查看源码。
    private Long id;

接受参数必填字段的处理

  1. 实体类属性添加注解:
    @NotBlank // 属性不能为null 和 空字符串。
    @NotNull // 属性不能为null。
    @NotEmpty // 属性不能为空字符串。
  2. controller层接受实体参数加 @Valid 注解
posted @ 2021-02-04 13:51  何时一身轻  阅读(458)  评论(0)    收藏  举报