- 官方文档:https://mp.baomidou.com/guide/
- 还是建议看官方文档学习,简单易学
一、CURD
-
INSERT
mybatis-plus会帮我们自动生成id(全局唯一),这就是主键生成策略。相关博客
uuid、自增id、雪花算法、redis、zookeeper
雪花算法:
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。
-
主键生成策略详解
-
主键自增
-
在实体类字段上增加注解==@TableId(type = IdType.AUTO)==
-
数据库字段一定要是自增的
-
测试
@Test public void testInsert() { User user = new User(); user.setName("olarian"); user.setAge(21); user.setEmail("niu@ola.com"); userMapper.insert(user); }
-
-
IdType枚举类型解释
AUTO(0),自增 NONE(1),未设置主键 INPUT(2),手动输入 ASSIGN_ID(3), ASSIGN_UUID(4),
-
-
UPDATE
@Test public void testUpdate() { User user = new User(); user.setId(6L); user.setName("olatest"); userMapper.updateById(user); }
-
SELECT
@Test public void testSelect() { userMapper.selectById(1L); // 批量查询 userMapper.selectBatchIds(Arrays.asList(1, 2, 3)).forEach(System.out::println); }
多条件查询:
@Test public void testSelectByMap() { Map<String, Object> objectObjectMap = new HashMap<>(); // 自定义要查询的条件(多条件查询) objectObjectMap.put("name", "Jone"); userMapper.selectByMap(objectObjectMap); }
-
DELETE
@Test public void testDelete() { userMapper.deleteById(8L); }
**逻辑删除:**不从数据库中移除数据,而是通过一个变量来让他失效!deleted=0 => deleted=1!防止数据丢失,类似于回收站。
实现方式:
-
在数据表中增加一个deleted字段
-
实体类增加字段并添加@TableLogic注解
-
application.yaml配置
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0
-
测试
@Test public void testDelete() { userMapper.deleteById(1L); }
-
再次查询已无查询结果
-
-
自动填充
-
方式一
数据库级别修改
1. 在表中新增字段create_time,update_time 2. 同步实体类 3. 测试
-
方式二
代码级别修改
1. 删除数据库的默认值、更新操作 2. 实体类字段属性上增加注解
@Data @AllArgsConstructor @NoArgsConstructor public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; }
3. 编写处理器来处理这个注解
@Component @Slf4j public class UserHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill"); this.setFieldValByName("createTime", new Date(), metaObject); this.setFieldValByName("updateTime", new Date(), metaObject); } @Override public void updateFill(MetaObject metaObject) { log.info("start insert fill"); this.setFieldValByName("updateTime", new Date(), metaObject); } }
4. 测试
-
二、乐观锁
实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时,set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
测试MP的乐观锁插件
-
给数据库中增加version字段
-
同步实体类字段,version字段上增加@Version注解
-
注册组件
@Configuration @MapperScan("com.ola.mapper") @EnableTransactionManagement // 自动管理事务 public class MybatisPlusConfig { // 注册乐观锁插件 @Bean public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { return new OptimisticLockerInnerInterceptor(); } }
-
测试
-
说明
1.支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime 2.整数类型下 newVersion = oldVersion + 1 3.newVersion 会回写到 entity 中 4.仅支持 updateById(id) 与 update(entity, wrapper) 方法 5.在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
三、分页查询
-
原始Limit分页
-
pageHelper等第三方插件分页
-
MP内置的分页插件
-
注册分页插件
@Configuration @MapperScan("com.ola.mapper") @EnableTransactionManagement public class MybatisPlusConfig { /** 注册乐观锁插件 */ @Bean public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { return new OptimisticLockerInnerInterceptor(); } /** 分页插件 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
-
直接使用page对象测试
@Test public void testPage() { Page<User> page = new Page<>(1, 2); userMapper.selectPage(page, null); page.getRecords().forEach(System.out::println); }
-
四、条件构造器Wrapper(用于复杂查询)
看文档去吧