MybatisPlus自定义sql使用分页查询,同时使用条件构造器

MybatisPlus为我们提供了强大的单表增删改查的方法,并且加入了分页插件,自动化实现了物理分页,十分好用.  但在实际中, 单表的增删改查明显是不够的, 如果加入了多表操作, 也想使用提供的条件构造器以及分页插件如何做到呢?

1.mapper接口

public interface ServeMapper extends BaseMapper<Serve> {
    IPage<Serve> getServes( IPage<Serve> page, @Param(Constants.WRAPPER) Wrapper<Serve> queryWrapper );
}

1).返回参数设置为IPage<Object>

    其中Object是自己定义的实体类或者对应的vo类, mybatis-plus会根据查询列的参数名和vo类进行自动绑定赋值; 

    IPage表名返回类型为mybatisplus的分页插件的类,其中有records(记录), current(当前页), limit(每页多少条记录)等分页信息

2).参数传递分页对象IPage, 和条件构造器Wrapper

   需要注意的是, 分页参数要放在条件构造器参数前面, 否则会出莫名其妙的错误. @Param(Constant.WRAPPER) 注解是必须的

    Wrapper中的泛型是否需要, 这个我暂时还不清楚, 希望有大佬解释.

2.xml文件编写sql

<select id="getServes" resultType="com.kjfw.shannxi.entity.Serve">
     select s.id , s.name , s.content, s.score , i.name from
        serve s left join institution i on s.institutionId = i.id
     ${ew.customSqlSegment}
</select>

1). id要和接口对应

2). 要在最后加上${ew.customSqlSegment} 

3). 使用了分页插件 , 那就不要加limit语句

4). 给表起别名, 可以在条件构造器中对另一个表进行条件限制

3.测试

@Test
    public void testPage(){
        QueryWrapper<Serve> serveQueryWrapper = new QueryWrapper<>();
        serveQueryWrapper.like("s.name" , "检测");
        serveQueryWrapper.ge("s.score",4);
        serveQueryWrapper.eq("i.id","2");
        Page<Serve> servePage = new Page<>(1,5);
        IPage<Serve> serves = serveMapper.getServes( servePage , serveQueryWrapper);
        // 获取总数
        serves.getTotal();
        // 获取页数
        serves.getPages();
        // 获取分页的记录
        List<Serve> records = serves.getRecords();
        System.out.println(records);
    }

1).  new一个条件构造器

2). 为条件构造器添加条件, (可以添加其他表的条件)

3). new一个分页对象, 泛型为分页的记录对象

4). 设置分页对象的参数(当前页, 分页大小)

5). 执行mapper方法, 分别传入分页对象和条件构造器(再次强调, 分页对象要在条件构造器对象之前)

4.结果分析

==>  Preparing: SELECT COUNT(1) FROM serve s LEFT JOIN institution i ON s.institutionId = i.id WHERE (s.name LIKE ? AND s.score >= ? AND i.id = ?) 
==> Parameters: %检测%(String), 4(Integer), 2(String)
<==    Columns: COUNT(1)
<==        Row: 1
==>  Preparing: select s.id , s.name , s.content, s.score , i.name from serve s left join institution i on s.institutionId = i.id WHERE (s.name LIKE ? AND s.score >= ? AND i.id = ?) LIMIT ?,? 
==> Parameters: %检测%(String), 4(Integer), 2(String), 0(Long), 5(Long)
<==    Columns: id, name, content, score, name
<==        Row: 4238048, 超高温发动机材料检测, <<BLOB>>, 5, 陕西省交通新能源开发、应用与汽车节能重点实验室
<==      Total: 1

1). 第一个Preparing是分页条件查询符合条件的总记录数的查询语句

      可以看到, wrapper条件构造器, eq(), ge()等方法解释为了具体的sql语句, 拼接在了sql语句最后

2). 第一个Preparing是将符合条件的具体记录查询出来, 并将分页的条件放在最后, 实现分页

3). 最终mybatisplus会将返回的结果绑定在Page对象的泛型中, 放在records中返回.

上一篇:shell实战Day28


下一篇:day28_常用模块——hashlib