十一|十一 . mybatis-plus(升级)

一、逻辑删除(假删除) 1、application.yml 加入配置(如果你的默认值和mp默认的一样,该配置可无):

mybatis-plus: global-config: db-config: # 全局配置 也可以在注解上指定 logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

2、注册 Bean(3.1.1开始不再需要这一步):
import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfiguration { @Bean public ISqlInjector sqlInjector() { return new LogicSqlInjector(); } }

3、实体类字段上加上@TableLogic注解
@Data public class User { @TableLogic private Boolean locked; }

3、使用mp自带方法删除和查找都会附带逻辑删除功能
删除时 update user set locked=1 where id =1 and locked=0 查找时 select * from user where locked=0

二、乐观锁 1、说明
【十一|十一 . mybatis-plus(升级)】当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败
2、插件配置
@Configuration public class MybatisPlusConfiguration { @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }

3、注解实体字段 @Version
@Data public class User { @Version private Integer version; }

4、注意
  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion 会回写到 entity
  • 仅支持 updateById(id)update(entity, wrapper) 方法
  • 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
5、栗子
@Test public void testVersion() { User user = new User(); user.setUid(1); user.setVersion(10); int update = userMapper.update(user, null); log.debug(update + ""); }

三、ActiveRecord 1、说明
活动记录,是一种领域模型模式,
通俗的来说就是数据表对应的实体类只需继承 Model 类即可实现基本 CRUD 操作
2、实体类
@EqualsAndHashCode(callSuper = true) @Data public class Userextends Model { }

3、UserMapper
注意虽然可以不需要UserMapper的接口,但底层还是实际还是调用了,所以比必须声明
public interface UserMapperextends BaseMapper { }

4、基本操作
更新操作
@RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class UserMapperARTest { @Test public void update(){ User user = new User(); user.setUid(1); user.setUsername("测试AR模式"); boolean isSuccess = user.updateById(); log.debug(""+ isSuccess); } }

查询操作
@RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class UserMapperARTest { @Test public void select() { // 其它操作跟Mapper通用方法一样 User user = new User(); int result = user.selectCount(new QueryWrapper().eq("locked", 0)); log.debug("" + result); } }

分页操作
@Test public void selectPage() { User user = new User(); IPage page = user.selectPage(new Page<>(1, 10), new QueryWrapper().like("username", "test")); List users = page.getRecords(); users.forEach(u -> u.getUsername()); }

    推荐阅读