mybatis-dalgen之paging、optimize用法

一. 普通分頁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.javaUserDOMapper.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>

三. 總結

  1. pagingCntType還有其他配置參數(paging、optimize、pagingExtCnt、pagingCustom),感興趣的小夥伴可以自己去研究一下
  • paging 默認類型,跟之前保持一致
  • optimize 增強 解決分頁到最後時回表導致查詢慢
  • pagingExtCnt 對distinct支持
  • pagingCustom 自定義分頁Count operation (萬能型)
  1. sql優化技巧要靈活貫通,不同的寫法效率是不一樣的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章