一. 普通分頁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優化技巧要靈活貫通,不同的寫法效率是不一樣的