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);
}
查询结果: