Mybatis-Plus 多表联查分页的实现代码

时间:2022-11-29 08:16:33

上一节,简单讲述了 mybatis-plus 搭建与使用入门,这一节,简单讲一下如何使用 mp 实现多表分页。

分析

使用的工程,依旧是 spring-boot,关于分页,官网给出了一个单表的demo,其实多表分页实现原理相同,都是通过 mybatis 的拦截器

(拦截器做了什么?他会在你的 sql 执行之前,为你做一些事情,例如分页,我们使用了 mp 不用关心 limit,拦截器为我们拼接。我们也不用关心总条数,拦截器获取到我们 sql 后,拼接 select count(*) 为我们查询总条数,添加到参数对象中)。

实现

1. 配置拦截器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@enabletransactionmanagement
@configuration
@mapperscan("com.web.member.mapper")
public class mybatisplusconfig {
  /**
   * mybatis-plus sql执行效率插件【生产环境可以关闭】
   */
  @bean
  public performanceinterceptor performanceinterceptor() {
    return new performanceinterceptor();
  }
 
  /*
   * 分页插件,自动识别数据库类型 多租户,请参考官网【插件扩展】
   */
  @bean
  public paginationinterceptor paginationinterceptor() {
    return new paginationinterceptor();
  }
}

2. mapper 接口以及 xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * <p>
 * 用户表 mapper 接口
 * </p>
 *
 * @author 殷天文
 * @since 2018-06-01
 */
public interface usermapper extends basemapper<user> {
 
  list<userlistmodel> selectuserlistpage(pagination page ,@param("user") userlistbean user);
  
}

这里要注意的是,这个 pagination page 是必须要有的,否则 mp 无法为你实现分页。

?
1
2
3
4
5
6
7
8
9
10
11
<select id="selectuserlistpage" resulttype="com.web.member.model.userlistmodel">
  select
    *
  from
    ftms_user u
  left join ftms_user_level l on u.level_id = l.id
  where 1=1
    <if test="user.nickname != null">
      and u.nickname like "%"#{user.nickname}"%"
    </if>
</select>

3. service 实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import com.web.member.beans.admin.userlistbean;
import com.web.member.entity.user;
import com.web.member.mapper.usermapper;
import com.web.member.model.userlistmodel;
import com.web.member.service.userservice;
import com.baomidou.mybatisplus.plugins.page;
import com.baomidou.mybatisplus.service.impl.serviceimpl;
 
import org.springframework.stereotype.service;
import org.springframework.transaction.annotation.transactional;
 
/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author 殷天文
 * @since 2018-06-01
 */
@service
public class userserviceimpl extends serviceimpl<usermapper, user> implements userservice {
 
  @transactional(readonly=true)
  @override
  public page<userlistmodel> selectuserlistpage(userlistbean user) {
    page<userlistmodel> page = new page<>(user.getcurr(), user.getnums());// 当前页,总条数 构造 page 对象
    return page.setrecords(this.basemapper.selectuserlistpage(page, user));
  }
  
}

最后将结果集 set 到 page 对象中,page 对象的 json 结构如下

?
1
2
3
4
5
6
7
8
9
10
11
12
{
  "total": 48,//总记录
  "size": 10,//每页显示多少条
  "current": 1,//当前页
  "records": [//结果集 数组
    {...},
    {...},
    {...},
     ...
  ],
  "pages": 5 // 总页数
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.jianshu.com/p/759b6430ed5b