Mybatis Plus本身提供基于Service和Mapper的各种增删改查的方法。

我们来详细看一下Mybatis Plus中Mapper的查询功能。




java mapper 间连接查询 mapper查询所有数据_Test

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