PageHelper還是MyBatis Plus自帶分頁插件?

在座CRUD boy肯定對各種分頁方式熟稔于心,那么,有沒有思考過為什么用它?有什么優(yōu)缺點(diǎn)?性能如何?
就拿MyBatis Plus(以下簡稱MP)自帶的PaginationInnerInterceptor(真特么長,以下簡稱PII)和PageHelper(以下簡稱PH)來比較,你更中意那種?


假設(shè)有一個(gè)非常復(fù)雜的分頁查詢場景,需要在XML中手寫原生SQL,PH的Mapper會(huì)是這樣子的:

public interface UserMapper extends BaseMapper<User> {
    List<User> selectNative(UserQuery query);
}

咦~貌似和原始MyBatis沒有任何區(qū)別!

然后,PII是這樣子寫的(分頁參數(shù)必須放第一個(gè),第二個(gè)參數(shù)必須帶@Param注解):

public interface UserMapper extends BaseMapper<User> {
    IPage<User> selectNative(IPage<User> page, @Param("query") UserQuery query);
}

嗯~看起來稍微麻煩一丟丟……


PH的XML是這樣子的:

<mapper namespace="com.iakuil.mvp.dao.UserMapper">
    <select id="selectNative" resultType="com.hxzf.mvp.dao.entity.User" parameterType="com.iakuil.mvp.domain.UserQuery">
        select * from t_user where create_time &gt;= #{regStart} and create_time &lt;= #{regEnd}
    </select>
</mapper>

你騙我!這特么就是MyBatais原來的樣子!

PII的XML也有所不同:

<mapper namespace="com.iakuil.mvp.dao.UserMapper">
    <select id="selectNative" resultType="com.iakuil.mvp.dao.entity.User" parameterType="com.iakuil.mvp.domain.UserQuery">
        select * from t_user where create_time &gt;= #{query.regStart} and create_time &lt;= #{query.regEnd}
    </select>
</mapper>

多包了一層query,條件一多,是不是就有點(diǎn)礙眼了?

無疑PII更接近于JPA的寫法,但是耦合也更嚴(yán)重,而PH更加簡潔。

【總結(jié)】

  • 如果不打算手寫SQL,兩者差異不大;
  • 如果需要兼容原生MyBatis的XML,或者將來可能換成其他MyBatis擴(kuò)展(比如通用Mapper),強(qiáng)烈安利PH!

BTW. 即使是非原生SQL的場景,PH也有優(yōu)勢,比如對于多余的排序參數(shù)的處理。所以我的建議是:PageHelper+MP BaseMapper核心方法(除了分頁)。


2022年1月27日編輯
自從體驗(yàn)了MyBatis Plus Generator(3.5.1版本)以后,我對代碼生成器有了很大的改觀,可以參考若依的BaseController.startPage()更加優(yōu)雅的實(shí)現(xiàn)分頁,至于如何擴(kuò)展自己的模板生成DTO等,請移步后面的文章。

--- THE END ---

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容