Mybatis Plus本身提供基于Service和Mapper的各种增删改查的方法。
我们来详细看一下Mybatis Plus中Mapper的查询功能。
Mybatis Plus mapper查询用法
Mybatis Plus的查询默认提供了10种查询方式,主要支持单条查询和批量查询,还有就是返回值的区别,我们来看看每种查询的使用方式。
1、根据主键查询单条记录
代码 :
@Test public void testSelectById() { System.out.println(("----- selectById method test ------")); User user = userMapper.selectById(1); System.out.println(user); }
输出 :
==> Preparing: SELECT id,name,age,email FROM user WHERE id=? ==> Parameters: 1(Integer)<== Columns: ID, NAME, AGE, EMAIL<== Row: 1, Jone, 18, test1@baomidou.com<== Total: 1
System.out.println输出:
User(id=1, name=Jone, age=18, email=test1@baomidou.com)
2、根据指定条件,查询单条数据
代码:
@Test public void testSelectOne() { System.out.println(("----- selectOne method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("Name", "Jack"); User user = userMapper.selectOne(wrapper); System.out.println(user); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Name = ?) ==> Parameters: Jack(String)<== Columns: ID, NAME, AGE, EMAIL<== Row: 2, Jack, 20, test2@baomidou.com<== Total: 1
System.out.println输出:
User(id=2, name=Jack, age=20, email=test2@baomidou.com)
3、根据主键的集合,查询多条数据
代码:
@Test public void testSelectBatchIds() { System.out.println(("----- selectBatchIds method test ------")); List ids = new ArrayList<>(); ids.add(1); ids.add(2); List users = userMapper.selectBatchIds(ids); users.forEach(System.out::println); }
输出 :
==> Preparing: SELECT id,name,age,email FROM user WHERE id IN ( ? , ? ) ==> Parameters: 1(Integer), 2(Integer)<== Columns: ID, NAME, AGE, EMAIL<== Row: 1, Jone, 18, test1@baomidou.com<== Row: 2, Jack, 20, test2@baomidou.com<== Total: 2
System.out.println输出:
User(id=1, name=Jone, age=18, email=test1@baomidou.com)User(id=2, name=Jack, age=20, email=test2@baomidou.com)
4、根据Map作为条件,查询多条数据
代码:
@Test public void testSelectByMap() { System.out.println(("----- selectByMap method test ------")); Map columnMap = new HashMap<>(); columnMap.put("Name","Jack"); columnMap.put("Name","Jone"); columnMap.put("Age",20); List users = userMapper.selectByMap(columnMap); users.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE Age = ? AND Name = ? ==> Parameters: 20(Integer), Jone(String)<== Total: 0Closing non transactio
这里查询结果为0条是数据,看日志输出,age:20,Name:Jone。
我实际的Name设置了两次,分别是:
columnMap.put("Name","Jack");columnMap.put("Name","Jone");
我们都知道map的特性,key不能重复,所以设置两次肯定是以最后一次为准,所以这里的参数是Name:Jone。
实际Jone的age是18,我参数设置了20,肯定查不出来,设置为18是可以查出结果的。
selectByMap的作用就是基于一列的多个字段作为条件来查询,并且条件是and的关系。
5、根据设置条件统计总记录数
代码:
@Test public void testSelectCount() { System.out.println(("----- selectCount method test ------")); Map columnMap = new HashMap<>(); columnMap.put("Name","Jack"); columnMap.put("Name","Jone"); columnMap.put("Age",20); Integer integer = userMapper.selectCount(null); System.out.println(("----- 总记录数: "+integer)); }
输出:
==> Preparing: SELECT COUNT( 1 ) FROM user ==> Parameters: <== Columns: COUNT(*)<== Row: 5<== Total: 1
System.out.println输出:
----- 总记录数: 5
6、根据条件查询列表,这个我们在第一节就演示过了,看下源码定义:
/** * 根据 entity 条件,查询全部记录 * * @param queryWrapper 实体对象封装操作类(可以为 null) */ List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);
第一节内容的代码:
@Test public void testSelect() { System.out.println(("----- selectAll method test ------")); List userList = userMapper.selectList(null); Assert.assertEquals(5, userList.size()); userList.forEach(System.out::println); }
7、基于条件将查询结果以List返回
代码:
@Test public void testSelectMaps() { System.out.println(("----- selectMaps method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.gt("Age", 21); List> list = userMapper.selectMaps(wrapper); list.forEach(user -> user.forEach((k,v)->{ // 打印键,打印值 System.out.println(k + "----" +v); })); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Age > ?) ==> Parameters: 21(Integer)<== Columns: ID, NAME, AGE, EMAIL<== Row: 3, Tom, 28, test3@baomidou.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 2
上面是SQL输出,下面是代码打印输出:
ID----3EMAIL----test3@baomidou.comNAME----TomAGE----28ID----5EMAIL----test5@baomidou.comNAME----BillieAGE----24
sql查询条件是年龄大于21的人,打印了两条数据,是key—-value的格式打印的。
8、基于条件查询,返回一个主键的list,也就是返回的是主键的集合
代码:
@Test public void testSelectObjs() { System.out.println(("----- selectObjs method test ------")); QueryWrapper wrapper = new QueryWrapper(); wrapper.gt("Age", 21); List users = userMapper.selectObjs(wrapper); users.forEach(System.out::println); }
输出:
==> Preparing: SELECT id,name,age,email FROM user WHERE (Age > ?) ==> Parameters: 21(Integer)<== Columns: ID, NAME, AGE, EMAIL<== Row: 3, Tom, 28, test3@baomidou.com<== Row: 5, Billie, 24, test5@baomidou.com<== Total: 2
System.out::println的输出:
35
9、基于条件的分页查询,在第二节已经讲过,这里贴出源码的方法定义
/** * 根据 entity 条件,查询全部记录(并翻页) * * @param page 分页查询条件(可以为 RowBounds.DEFAULT) * @param queryWrapper 实体对象封装操作类(可以为 null) */ > E selectPage(E page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
第二节内容的代码:
@Test public void testSelectPage() { System.out.println(("----- selectAll method test ------")); Page userPage = userMapper.selectPage(new Page(1, 2), null); List records = userPage.getRecords(); records.forEach(System.out::println); }
10、基于条件的分页查询,在第二节已经讲过,这里贴出源码的方法定义
/** * 根据 Wrapper 条件,查询全部记录(并翻页) * * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类 */ >> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper queryWrapper);