一. 普通分页paging
增加**multiplicity=“paging” paging=“UserList”**即可,生成代码如下
TP_USER.xml
<operation name="getAllUser" multiplicity="paging" paging="UserList" remark="查询所有用户">
SELECT * FROM TP_USER
</operation>
运行mybatis:gen后,生成下面文件(如下图)
额外多新增了2个文件,BasePage.java和UserListPage.java
1.BasePage.java首次会生成,后面就不会新增了
2.UserListPage是根据paging="UserList"这个设置去动态生成的对象
UserDAO.java
/**
* desc:查询所有用户.<br/>
* @param userList userList
* @return UserListPage
*/
public UserListPage getAllUser(UserListPage userList){
int total = userDOMapper.getAllUserCount(userList);
if(total>0){
userList.setDatas(userDOMapper.getAllUserResult(userList));
}
userList.setTotal(total);
return userList;
}
UserDOMapper.java
/**
* desc:查询所有用户.<br/>
* descSql = SELECT * FROM TP_USER
* @param userList userList
* @return int
*/
int getAllUserCount(UserListPage userList);
/**
* desc:查询所有用户.<br/>
* descSql = SELECT * FROM TP_USER
* @param userList userList
* @return List<UserDO>
*/
List<UserDO> getAllUserResult(UserListPage userList);
UserDOMapper.xml
其中,
1.多新增一个查询总数的方法
2.查询列表的方法会自动加上limit #{startRow},#{limit}
<!--查询所有用户 pageCount-->
<select id="getAllUserCount" resultType="int">
SELECT
COUNT(*) AS total
FROM
TP_USER
</select>
<!--查询所有用户 pageResult-->
<select id="getAllUserResult" resultMap="BaseResultMap">
SELECT /*MS-TP-USER-GETALLUSER*/ <include refid="Base_Column_List" /> FROM TP_USER
limit #{startRow},#{limit}
</select>
二. 增强分页optimize
OK,以上是普通分页的查询的方法,那么optimize怎么用呢
1.增加pagingCntType=“optimize”
2.需要将sql改造(当表中存在数据比较大时,越往后分页越慢,利用id去关联分页会提升查询效率)
3.分页部分需要增加<optimizePaging>和</optimizePaging>
想知道如何高效给亿级数据分页查询,可以去看一下我之前写的如何将过亿订单数据实现毫秒级分页查询
TP_USER.xml
<operation name="getAllUser" multiplicity="paging" paging="UserList" pagingCntType="optimize" remark="查询所有用户">
SELECT id FROM
(
<optimizePaging>
SELECT id FROM TP_USER
</optimizePaging>
) a
JOIN TP_USER b
ON a.id = b.id
</operation>
如果sql不改造会出现什么情况呢?
就会出现一个新手都容易出现的错误:
java.lang.IllegalArgumentException (at org.apache.commons.lang.Validate.notEmpty:248): optimize 模式必须配置
UserDAO.java和UserDOMapper.java还是一样的代码
UserDOMapper.xml
分页limit #{startRow},#{limit}会增加到上面添加的标识<optimizePaging>这个里面的sql
<!--查询所有用户 pageCount-->
<select id="getAllUserCount" resultType="int">
SELECT
COUNT(*) AS total
FROM
TP_USER
</select>
<!--查询所有用户 pageResult-->
<select id="getAllUserResult" resultMap="BaseResultMap">
SELECT /*MS-TP-USER-GETALLUSER*/ id FROM
(
SELECT /*MS-TP-USER-GETALLUSER*/ id FROM TP_USER
limit #{startRow},#{limit}
) a
JOIN TP_USER b
ON a.id = b.id
</select>
三. 总结
- pagingCntType还有其他配置参数(paging、optimize、pagingExtCnt、pagingCustom),感兴趣的小伙伴可以自己去研究一下
- paging 默认类型,跟之前保持一致
- optimize 增强 解决分页到最后时回表导致查询慢
- pagingExtCnt 对distinct支持
- pagingCustom 自定义分页Count operation (万能型)
- sql优化技巧要灵活贯通,不同的写法效率是不一样的