MyBatisPlus学习记录

72 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

  • Mapper类继承基本的类 BaseMapper:所有的CRUD操作都已经编写完成了
  • 需要在主启动类上去扫描我们的mapper包下的所有接口:@MapperScan("com.takeoff.mapper")
  List<User> users = userMapper.selectList(null);
  //参数是一个 Wrapper ,条件构造器,这里我们先不用,所以为null
  //查询全部用户

配置日志

默认的情况下,sql是不可见的

  //配置文件
  mybatis-plus.configuration.log-impl = org.apache.ibatis.logging.stdout.StdOutImpl

CRUD扩展

  • Insert插入
    User user = new User();
   user.setName("test");
   int result = userMapper.insert(user);//帮我们自动生成id
   //result:受影响的行数
  • 数据库插入的id默认值为:全局的唯一id。

主键生成策略

  • 默认 ID_WORKER 全局唯一ID

分布式系统唯一id生成:雪花算法--结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(前5个是数据中心,后5个机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生4096个ID),最后还有一个符号位,永远是0。可以保证几乎全球唯一!

  • 主键自增

我们需要配置主键自增:
1、实体类字段上  @TableId(type = IdType.AUTO)
2、数据库字段一定要是自增!

自动填充

创建时间、修改时间等几乎所有表都需要配置上,且自动更新。
在数据库和代码上都可以操作

  • 代码级别

1.实体类字段属性上需要增加注解

    //字段添加填充内容
   @TableField( fill = FieldFill.INSERT)
   private Date createTime;
   
   @TableField( fill = FieldFill.INSERT_UPDATE)
   private Date updateTime; 

2.编写处理器来处理这个注解即可!
处理器代码

乐观锁

  • 乐观锁:无论干什么都不会上锁。 悲观锁:无论干什么都会去上锁

乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败
  • 测试MP的乐观锁插件

1.给数据库中增加version字段!
2.我们实体类加对应的字段

    @Version   //乐观锁Version注解
    private Integer version

3.注册组件

    @Bean
   public OptimistiLockerInterceptor 0ptimistiLockerInterceptor() {
       return new OptimistiLockerInterceptor();
   }

分页查询

  • 使用方法

1、配置拦截器

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

2、直接使用Page对象

    //参数一:当前页    参数二:页面大小
    Page<User> page = new Page<>(2,5);
   userMapper.selectPage(page,null);
   

逻辑删除

  • 物理删除:从数据库直接删除
  • 逻辑删除:数据库没有被移除,通过一个变量来判断他是否失效

步骤;

  • 1.在数据库中增加一个 deleted 字段
  • 2.实体类中增加属性
@TableLogic
private Integer deleted
  • 3.配置!
// 逻辑删除组件
@Bean
public ISqlInjector sqlInjector(){
    return new LogicSqlInjector();
}

性能分析插件

暂时省略,工作环境用到不多

条件构造器 Wrapper

测试代码

    QueryWrapper<User> wrapper = new QueryWrapper<>();
    
   wrapper.isNotNull("name")    //查询name不为空
             .isNotNull("email")    //并且邮箱不为空
        .ge("age",12);        //年龄大于等于12
        
   userMapper.selectList(wrapper).forEach(System.out::println);//查询多个数据
   userMapper.selectOne(wrapper);//查询多个数据
   Integer count = userMapper.selectCount(wrapper);//查询结果数
   
   wrapper.eq("name","test")    //查询name 等于 test
   wrapper.between("age",23,30)    //查询age在23到30之间
   wrapper.notLike("name","e")    //模糊查询 notlike %e%
           .likeRight("email","t");    //模糊查询 like t%
   wrapper.inSql("id","select id from user where id = 3"); //子查询
   wrapper.orderByAsc("id");    //通过id进行排序