在座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 >= #{regStart} and create_time <= #{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 >= #{query.regStart} and create_time <= #{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 ---