美文网首页
springboot mybatisplus进阶

springboot mybatisplus进阶

作者: 杨健kimyeung | 来源:发表于2020-08-08 08:56 被阅读0次

    一、逻辑删除(假删除)

    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、说明

    当要更新一条记录的时候,希望这条记录没有被别人更新

    乐观锁实现方式:

    • 取出记录时,获取当前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 User  extends Model<User> {
    }
    

    3、UserMapper

    注意虽然可以不需要UserMapper的接口,但底层还是实际还是调用了,所以比必须声明

    public interface UserMapper  extends BaseMapper<User> {
    }
    

    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<User>().eq("locked", 0));
            log.debug("" + result);
        }
    }
    

    分页操作

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

    相关文章

      网友评论

          本文标题:springboot mybatisplus进阶

          本文链接:https://www.haomeiwen.com/subject/tkicdktx.html