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

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

作者: nitricoxide | 来源:发表于2021-07-05 19:36 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:Mybatis分页查询和总条数避免查询两次的方法

          本文链接:https://www.haomeiwen.com/subject/oquiultx.html