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优化技巧要灵活贯通,不同的写法效率是不一样的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章