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
网友评论