Mybatis-plus的查詢操作
通過UserMapper可以看出有這么多的查詢方法:
接下來我們分別介紹一下其中的每一種方法
1.selectObjects()
這個方法傳入的參數是Wrapper類型的,關於條件構造器(Wrapper)的介紹請看https://mp.baomidou.com/guide/wrapper.html#alleq
當傳入參數為null的時候,查詢的就是全部的數據,返回的值類型就是Object類型的。
@Test
void contextLoads() {
//參數是一個wrapper,條件構造器,
QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("name","wp223");
List<Object> objects = userMapper.selectObjs(qw);
objects.forEach(System.out::println);
}
查詢結果:
通過查詢結果可以看出,只是通過主鍵查詢出來了主鍵ID,返回的是一個Object對象
2.SelectMaps()
這些方法的參數傳入的一般都是條件構造器,所以下面就不說名參數的傳遞了
可以看出返回的是一個Map類型,String作為鍵,Object作為值的。
@Test
void contextLoads() {
//查詢全部用戶
//參數是一個wrapper,條件構造器,這里我們先用null
QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("name","wp223");
List<Map<String, Object>> maps = userMapper.selectMaps(qw);
System.out.println("輸出的數據條件");
maps.forEach(System.out::println);
}
輸出的結果:
可以看出結果都是數據對的形式。
3.SelectCount()
此函數查詢的是返回數據的記錄條數,
@Test
public void test2() {
QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("name","wp223");
Integer integer = userMapper.selectCount(qw);
System.out.println("輸出的結果"+integer);
}
執行結果:相當於調用了Count*
4.selectOne()
做單值查詢的函數
@Test
public void test3() {
QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("name","wp223");
User user = userMapper.selectOne(qw);
System.out.println("輸出的結果"+user.getId()+user.getName()+user.getAge()+user.getEmail());
}
這里需要注意如果你的查詢條件查出來的結果不是唯一的值的話會報錯。意思就是說期待的值是1或者是空,這是需要控制查詢條件
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2
修改條件控制器之后:
@Test
public void test3() {
QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("id","1");
User user = userMapper.selectOne(qw);
System.out.println("輸出的結果"+user.getId()+user.getName()+user.getAge()+user.getEmail());
}
查詢結果:
5.selectList()
查詢返回List集合,List中元素的類型是實體類對象類型
@Test
public void test4() {
QueryWrapper<User> qw = new QueryWrapper<>();
qw.isNotNull("name")
.gt("age",18);
List<User> users = userMapper.selectList(qw);
users.forEach(System.out::println);
}
查詢結果:可以看出影響的結果
6.selectPage(page, qw)
這里做了一個分頁查詢,分頁查詢的使用了一個簡答的分頁插件Page繼承自IPage
@Test
public void test5() {
QueryWrapper<User> qw = new QueryWrapper<>();
qw.isNotNull("name")
.gt("age",18);
Page<User> page = new Page<>(2,5);
IPage<User> userIPage = userMapper.selectPage(page, qw); //查詢到分頁記錄
List<User> records = userIPage.getRecords(); //直接取到分頁列表的對象記錄
records.forEach(System.out::println);
}
查詢結果:
7.selectByMap(map)
使用Map來控制查詢條件,
@Test
public void test6() {
HashMap<String, Object> map = new HashMap<>();
map.put("name","wp223");
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}
為什么要再出現map去做查詢的,條件控制器不是更香嗎?設計者是從什么角度考慮的呢?
下面是查詢結果:
8.selectById(id)
通過主鍵查詢,
@Test
public void testSelectById() {
User user = userMapper.selectById(1L);
System.out.println(user);
}
查詢結果,可以看到他底層的sql
9.selectBatchIds(Arrays.asList(1, 2, 3))
這個用來做id的批量查詢,需要注意的是參數傳入的需要的是集合。在使用的時候要注意創建集合。
@Test
public void testSelectBanchId() {
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
users.forEach(System.out::println);
}
查詢結果:
10.selectMapsPage(page, qw)
這里做得是一個分頁查詢條件
@Test
public void tes7() {
Page page = new Page(2,5);
QueryWrapper<User> qw = new QueryWrapper<>();
qw.isNotNull("name")
.gt("age",18);
Page page1 = userMapper.selectMapsPage(page, qw);
page.getRecords().forEach(System.out::println);
}
查詢結果: