前言

1、做分页查询的时候,如果是单表还好,可以用mybatis-plus自带的分页,我们可以不用额外的去查询总数。

但如果是多表关联查询,就每次要写两个一样的sql,一个查询数据,一个查询总数,然后我就在想能不能在分页查询数据的时候,同时把总数量也查询出来。于是我在网上找了下,还真有,不过大多都是复制粘贴的,很多都有一样的问题。

问题

就比如:

<resultMap type="java.lang.Integer" id="count">
	<result column="total"/>
</resultMap>

<select id="selectPage" resultMap="自定义的resultMap,count">
	SELECT SQL_CALC_FOUND_ROWS * FROM  表名及条件
	WHERE ID in (SELECT ID from (SELECT ID FROM A LIMIT ${(pageNo-1)*pageSize},#{pageSize}) AS t)		
	order by ID;
	<!-- 查询数据量 -->
	SELECT FOUND_ROWS(*) AS total;
</select>

没错,我在网上找了半天,差不多都是这么写的,先不说能不能查询出来,就SELECT FOUND_ROWS(*) AS total; 这一句就会报语法错误,提示 *) 这里有错误,后面我把星号去掉了才能执行。

2、把上面那段数据库表和字段改成自己的,在 navicat 上执行:

SELECT SQL_CALC_FOUND_ROWS user_id,user_name,nick_name
FROM sys_user
WHERE user_id in (SELECT user_id from (SELECT user_id FROM sys_user LIMIT 0,10) AS t);
SELECT FOUND_ROWS() AS total;

我的user表里,有15条数据,执行出来后结果如图:
在这里插入图片描述
在这里插入图片描述
查询出来的total只有10条,其实这是每一页查询出来的数量,而不是总数量。

也不知道他们这样写的人自己有没有试过,还是就直接复制粘贴就完事了?错误都一模一样。

解决

3、最后我直接按照平时的分页查询方式,直接在sql语句上加上SQL_CALC_FOUND_ROWSSELECT FOUND_ROWS() AS total ,成功的在查询数据列表的时候同时查询总数。(也不知道他们怎么会把分页语句写到子查询里然后最为where条件来查询)

SELECT SQL_CALC_FOUND_ROWS user_id,user_name,nick_name
FROM sys_user
LIMIT 0,10;
SELECT FOUND_ROWS() AS total;

结果如图:
在这里插入图片描述
在这里插入图片描述

按照这种方法,来联表查询,无论是在navicat 还是在正式的项目中使用,都可以查询出总数量。

SELECT SQL_CALC_FOUND_ROWS a.user_id,a.user_name,a.nick_name,dept_name ,c.role_name
FROM sys_user a
LEFT JOIN sys_dept b on a.dept_id=b.dept_id
LEFT JOIN sys_role c on a.role_ids=c.role_id
WHERE user_name like '%test%' and dept_name ='开发部'
LIMIT 0,10;
SELECT FOUND_ROWS() AS total;

实际项目中使用

(1)UserMapper.xml
<resultMap type="com.sys.entity.User" id="UserResult">
    <id     property="userId"       column="user_id"      />
    <result property="deptId"       column="dept_id"      />
    <result property="userName"     column="user_name"    />
    <result property="nickName"     column="nick_name"    />
    <result property="roleIds"     column="role_ids"    />
    <result property="password"     column="password"     />
    <result property="createBy"     column="create_by"    />
    <result property="createTime"   column="create_time"  />
    <result property="updateBy"     column="update_by"    />
    <result property="updateTime"   column="update_time"  />
    <result property="remark"       column="remark"       />
</resultMap>

<resultMap type="java.lang.Integer" id="count">
    <result column="total"/>
</resultMap>

<select id="selectList" resultMap="UserResult,count">
   SELECT SQL_CALC_FOUND_ROWS a.user_id,a.user_name,a.nick_name,dept_name ,c.role_name
   FROM sys_user a
    LEFT JOIN sys_dept b on a.dept_id=b.dept_id
    LEFT JOIN sys_role c on a.role_ids=c.role_id
   <where>
       <if test="userName != null and userName != ''">
           AND u.user_name like concat('%', #{userName}, '%')
       </if>
       <if test="deptName != null and deptName != ''">
           AND d.dept_name like concat('%', #{deptName}, '%')
       </if>
   </where>
   order by create_time desc
   LIMIT ${pageSize * (pageNum-1)},${pageSize};
   SELECT FOUND_ROWS() AS total;
</select>
(2)UserMapper.java
List<Object> selectList(@Param("pageSize") Integer pageSize, @Param("pageNum") Integer pageNum,
                            @Param("userName") String userName,@Param("deptName") String deptName);
(3)UserService.java
public List<Object> selectList(Integer pageSize,Integer pageNum,String userName,String deptName) {
    return userMapper.selectList(pageSize,pageNum,userName,deptName);
}
(4)UserController.java
    /**
     * 获取用户列表
     * @return 用户列表
     */
    @GetMapping("/list")
    public ResultVo list(Integer pageSize, Integer pageNum,String userName,String deptName){
        
		List<Object> objList = userService.selectList(pageSize, pageNum, userName,deptName);
		
		List<User> list = (List<User>) objList.get(0);
		
		int count = ((List<Integer>) objList.get(1)).get(0);//总数
        
        Page<User> page = new Page<>(pageSize, pageNum);
        page.setSize(pageSize);
        page.setCurrent(pageNum);
        page.setTotal(count);
        //计算分页总页数
        page.setPages(count %10 == 0 ? count/10 :count/10+1);
        page.setRecords(list);
        return ResultVoUtil.success(page);
    }

最后,还需要在yml或propertis配置文件中,配置数据库连接池那里,在 url 中,加上 allowMultiQueries=true

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐