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_ROWS 和 SELECT 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;
<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>
List<Object> selectList(@Param("pageSize") Integer pageSize, @Param("pageNum") Integer pageNum,
@Param("userName") String userName,@Param("deptName") String deptName);
public List<Object> selectList(Integer pageSize,Integer pageNum,String userName,String deptName) {
return userMapper.selectList(pageSize,pageNum,userName,deptName);
}
/**
* 获取用户列表
* @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