Mybites plus用法速查

MP的分页查询

 1首先创建一个IPage接口下的Page类,其中第一条填查第几页,第二条 信息填几个数据分为一页

 2 用dao接口对象的selectPage方法查询,填入其对象和null进行查询

 3 ipge有如下api可以查询其对应的信息  

   @Test
    void selectBypage(){
        //两条为一页,取出第一页
       IPage iPage = new Page(1,2);
       bk.selectPage(iPage, null);
       System.out.println("当前页码"+iPage.getCurrent());
       System.out.println("一共多少页"+iPage.getPages());
       System.out.println("每页显示值"+iPage.getSize());
       System.out.println("一共的数据量"+iPage.getTotal());
       System.out.println("数据"+iPage.getRecords());
   }

但是仅仅做这些并达不到效果

我们会发现仅仅有我们传入的两个参数被打印了出来,而且还将所有的信息都打印出来了,并没有做到分页查询,这是因为我们这么写,其实是一种拦截然后加强操作,MP没有为我们提供拦截器,所以我们需要手动配置一个拦截器

@Configuration
public class MPconfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

再看效果

关于条件查询

其中传入的形参名字是wrapper即是包装的意思,我们想要按条件查询就需要写一个qureywrapper,查询包装类,展示lamda,表达式的与条件和或条件的写法

与查询

 @Test
    void selectWrapper() {
       LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper();
       lambdaQueryWrapper.lt(Book::getId,2).gt(Book::getId,0);
       List<Book> books = bk.selectList(lambdaQueryWrapper);
       System.out.println(books);
   }

或查询

 @Test
   void  selectWrapper2(){
       LambdaQueryWrapper<Book> bookLambdaQueryWrapper = new LambdaQueryWrapper<>();
       bookLambdaQueryWrapper.lt(Book::getId,2).or().gt(Book::getId,3);
       List<Book> books = bk.selectList(bookLambdaQueryWrapper);
       System.out.println(books);

   }

当传入的条件参数为null

    这种场景十分常见,比如在电商网购只输入上限不输入下限,如果不加处理会是怎么样的呢

    如果说正常的传递上下界参数正常的打印是ok的

   

@Test
    void selectBycondition(){
        //模拟页面传过来的条件查询
       QureyBook qureyBook = new QureyBook();
       qureyBook.setId(1);//下届
       qureyBook.setId2(3);//上界
       //创建查询条件
       LambdaQueryWrapper<Book> bookLambdaQueryWrapper = new LambdaQueryWrapper<>();
       bookLambdaQueryWrapper.lt(Book::getId,qureyBook.getId2()).gt(Book::getId,qureyBook.getId());
       //查询
       List<Book> books = bk.selectList(bookLambdaQueryWrapper);
       System.out.println(books);
   }

  但是如果这时候上界信息没有传就会报错,解决的方法有两种一种传统的将链式查询分开,并且加上if判断查询,可以奏效,但是更为简洁的,MP为我们提供的是如下这种

  bookLambdaQueryWrapper.lt(qureyBook.getId2()!=null, Book::getId,qureyBook.getId2())
                             .gt(qureyBook.getId() != null, Book::getId,qureyBook.getId());

前置了一个判断条件,即可奏效

查想要的列的信息,以及查分组

查投影

方式一

@Test
    void selectLIst(){
       LambdaQueryWrapper<Book> bookLambdaQueryWrapper = new LambdaQueryWrapper<>();
       bookLambdaQueryWrapper.select(Book::getId,Book::getType);
       List<Book> books = bk.selectList(bookLambdaQueryWrapper);
       System.out.println(books);
   }

方式二

@Test
    void selectList2(){
       QueryWrapper<Book> bookQueryWrapper = new QueryWrapper<>();
       QueryWrapper<Book> id = bookQueryWrapper.select("id");
       List<Book> books = bk.selectList(id);
       System.out.println(books);
   }

分组查询

 @Test
    void selecyBygroup(){
        //分组查询
       QueryWrapper<Book> bookQueryWrapper = new QueryWrapper<>();
       bookQueryWrapper.groupBy("type");
       List<Book> books = bk.selectList(bookQueryWrapper);
       System.out.println(books);
   }

等匹配

 @Test
    void selectequal(){
       LambdaQueryWrapper<Book> bookLambdaQueryWrapper = new LambdaQueryWrapper<>();
       bookLambdaQueryWrapper.eq(Book::getName,"华为");
       Book book = bk.selectOne(bookLambdaQueryWrapper);
       System.out.println(book);
   }

解决MP与数据库的兼容性

 问题一:domain层的类与数据库表名对应不上

 解决方法 :加映射

问题二 表中字段名和程序中列名对应不上

解决方案:加别名

问题三:查询不能将密码查出来

问题四,比如有些domain类存在在数据库表中不存在的信息,比如用户的在线状态

ID生成策略

assign_id: 雪花算法生成id,由占位符,时间戳,机器唯一标识符构成

assigin_uuid: 生成uuid是全局唯一的标识符

auto:按照数据库设定的规则生成

input:手动输入生成,不输入报错

配置全局的表名前缀

如此配置之后便不用在pojo类上再配置表名的绑带了,这是一个全局的配置

mybatis-plus:
  global-config:
    db-config:
      id-type: none
      table-prefix: ssm_

根据需求查询或删除多条数据

 @Test
    void deleteMany(){
        //因为要删除多个所以要添加一个集合
       ArrayList arrayList = new ArrayList();
       arrayList.add(1);
       arrayList.add(4);
       //根据id删除多条记录
        bk.deleteBatchIds(arrayList);
        //同样查询也有此API
   }

逻辑删除

情景:A表删除,其关联的B表中的数据也会删除,这在很多情景下是不允许的,所以MP引入了逻辑删除的概念,新加一个字段,删除就为一个数值,存在就是另外一个数值

全局变量设置

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: delect
      logic-delete-value: 1
      logic-not-delete-value: 0

需要注意的是此时,MP提供的删除的接口就不再是删除,而是UPDATE,将对应的字段改为1或0

乐观锁的添加

1数据库中添加version字段

2 pojo层中添加version属性(并添加@version字段)

3配置乐观锁拦截器

mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor())

  • 38
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值