Mybatis分页查询和总条数避免查询两次的方法

2021-07-05  本文已影响0人  nitricoxide

1. 场景

mysql分页查询一般都需要给前端返回一个总数,便于前端人员计算总页数。以前的处理办法是查询两次数据库,想提升下效率。

2. 处理办法

SELECT SQL_CALC_FOUND_ROWS * FROM [table] WHERE ......  limit M, N;
SELECT FOUND_ROWS();

SQL_CALC_FOUND_ROWS 告诉MySQL将sql所处理的行数记录下来
FOUND_ROWS() 则取到了这个纪录。

xml代码:

<resultMap type="com.xxx.UserDetail" id="UserDetail">
    <result column="id" jdbcType="INTEGER" property="id"/>
    <result column="nickName" jdbcType="VARCHAR" property="nickName"/>
    <result column="password" jdbcType="VARCHAR" property="password"/>
    <result column="trueName" jdbcType="VARCHAR" property="trueName"/>
    <result column="phone" jdbcType="VARCHAR" property="phone"/>
    <result column="locked" jdbcType="INTEGER" property="locked"/>
</resultMap>

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

<!-- 这个地方的resultMap中的内容会变红,不过不影响程序正常启动 -->
<select id="queryCorrectCreateList" resultMap="UserDetail,total">
    SELECT SQL_CALC_FOUND_ROWS
        id,
        nickName,
        password,
        trueName,
        phone,
        locked
    FROM
        auth_user
    WHERE
         locked != 1
    LIMIT #{offset}, #{pageSize};
    SELECT FOUND_ROWS() as total;
</select>

这个语句放到navicat中也可以直接执行,可以先检测下sql是否执行正确(我的总数据就是2)




mapper代码:

List<?> queryUserDetailsList(Integer offset, Integer pageSize);

service代码:

public List<?> queryUserDetailsList(Integer pageNum, Integer pageSize) {
    return userDao.queryUserDetailsList( (pageNum - 1 ) * pageSize, pageSize);
}

controller代码:

List<?> userDetails = userService.queryUserDetailsList(pageNum, pageSize);
List<UserDetail> userDetailList = (List<UserDetail>) userDetails.get(0);
Integer total = ((List<Integer>) userDetails.get(1)).get(0);

必须修改数据源的配置

allowMultiQueries=true
表示同时执行多条语句

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/yyhd_shiro?useSSL=false&allowMultiQueries=true&useAffectedRows=true
上一篇下一篇

猜你喜欢

热点阅读