MybatisPlus为我们提供了强大的单表增删改查的方法,并且加入了分页插件,自动化实现了物理分页,十分好用. 但在实际中, 单表的增删改查明显是不够的, 如果加入了多表操作, 也想使用提供的条件构造器以及分页插件如何做到呢?
public interface ServeMapper extends BaseMapper {
IPage getServes( IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper );
}
1).返回参数设置为IPage
其中Object是自己定义的实体类或者对应的vo类, mybatis-plus会根据查询列的参数名和vo类进行自动绑定赋值;
IPage表名返回类型为mybatisplus的分页插件的类,其中有records(记录), current(当前页), limit(每页多少条记录)等分页信息
2).参数传递分页对象IPage, 和条件构造器Wrapper
需要注意的是, 分页参数要放在条件构造器参数前面, 否则会出莫名其妙的错误. @Param(Constant.WRAPPER) 注解是必须的
Wrapper中的泛型是否需要, 这个我暂时还不清楚, 希望有大佬解释.
1). id要和接口对应
2). 要在最后加上${ew.customSqlSegment}
3). 使用了分页插件 , 那就不要加limit语句
4). 给表起别名, 可以在条件构造器中对另一个表进行条件限制
@Test
public void testPage(){
QueryWrapper serveQueryWrapper = new QueryWrapper<>();
serveQueryWrapper.like("s.name" , "检测");
serveQueryWrapper.ge("s.score",4);
serveQueryWrapper.eq("i.id","2");
Page servePage = new Page<>(1,5);
IPage serves = serveMapper.getServes( servePage , serveQueryWrapper);
// 获取总数
serves.getTotal();
// 获取页数
serves.getPages();
// 获取分页的记录
List records = serves.getRecords();
System.out.println(records);
}
1). new一个条件构造器
2). 为条件构造器添加条件, (可以添加其他表的条件)
3). new一个分页对象, 泛型为分页的记录对象
4). 设置分页对象的参数(当前页, 分页大小)
5). 执行mapper方法, 分别传入分页对象和条件构造器(再次强调, 分页对象要在条件构造器对象之前)
==> 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, 超高温发动机材料检测, <>, 5, 陕西省交通新能源开发、应用与汽车节能重点实验室
<== Total: 1
1). 第一个Preparing是分页条件查询符合条件的总记录数的查询语句
可以看到, wrapper条件构造器, eq(), ge()等方法解释为了具体的sql语句, 拼接在了sql语句最后
2). 第一个Preparing是将符合条件的具体记录查询出来, 并将分页的条件放在最后, 实现分页
3). 最终mybatisplus会将返回的结果绑定在Page对象的泛型中, 放在records中返回.