mybatis-plus 总结
mybatis-plus 3.4.0版本使用总结
通用实体类的定义
- 创建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;
}
- 自己编写的实体类需要继承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接口
- 创建自定义的通用BaseMapper接口。同时 extends mybatis-plus提供的基类 com.baomidou.mybatisplus.core.mapper.BaseMapper
public interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {
}
- mapper层的定义举例
- 自己编写的接口实现自定义的BaseMapper接口,泛型为自己相对应的实体类。
- Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器。
public interface UserMapper extends BaseMapper<User> { }
Service CRUD接口
-
创建通用的基本包路径

-
创建自定义的通用IService接口。同时 extends mybatis-plus提供的基类 com.baomidou.mybatisplus.extension.service.IService
public interface IService<T> extends com.baomidou.mybatisplus.extension.service.IService<T> {
}
- 创建自定义的通用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> {
}
- service 层的定义举例
- service层的接口继承自己自定义的通用IService接口
public interface UserService extends IService<User> { }- impl层实现类继承自定义的ServiceImpl类,同时实现相应的接口,编写自己的业务代码。
@Service @Transactional @Slf4j public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { }
乐观锁的使用
-
数据库增加version字段,默认为1。


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

-
注册相应的拦截器并纳入容器。
@Bean
public MybatisPlusInterceptor MybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//乐观锁
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
- 执行结果分析

分页插件的使用
- 分页插件拦截器配置
@Configuration
@EnableTransactionManagement //开启事务
@MapperScan("org.example.mapper") //扫描mapper文件夹
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor MybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//分页配置
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
- 测试案例
//分页查询
@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());
}
逻辑删除的使用
- 数据库添加逻辑删除的相应字段

- 在spring boot 的yml文件中配置
##配置逻辑删除
global-config:
db-config:
logic-delete-value: 1 //删除为1
logic-not-delete-value: 0 //不删除为0
- 实体类上加@TableLogic注解

字段自动填充功能
- 比如需要自动添加到数据库创建时间,更新时间,创建人,更新人等。数据库添加相应字段。

- 实现元对象处理器接口: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);
}
}
- 实体类相应属性加注解
@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;
主键填充策略
- 数据库主键id必须为自增,否则报错。


- 实体类增加注解
@TableId(type = IdType.AUTO) //AUTO为主键自增
//ID_WORKER为全局唯一id,使用mybatis-plus插入会使用雪花算法自动生成long型的唯一id,回填到id字段中。具体查看源码。
private Long id;
接受参数必填字段的处理
- 实体类属性添加注解:
@NotBlank // 属性不能为null 和 空字符串。
@NotNull // 属性不能为null。
@NotEmpty // 属性不能为空字符串。 - controller层接受实体参数加 @Valid 注解

浙公网安备 33010602011771号