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())