在座CRUD boy肯定對(duì)各種分頁(yè)方式熟稔于心,那么,有沒(méi)有思考過(guò)為什么用它?有什么優(yōu)缺點(diǎn)?性能如何?
就拿MyBatis Plus(以下簡(jiǎn)稱MP)自帶的PaginationInnerInterceptor(真特么長(zhǎng),以下簡(jiǎn)稱PII)和PageHelper(以下簡(jiǎn)稱PH)來(lái)比較,你更中意那種?
假設(shè)有一個(gè)非常復(fù)雜的分頁(yè)查詢場(chǎng)景,需要在XML中手寫原生SQL,PH的Mapper會(huì)是這樣子的:
public interface UserMapper extends BaseMapper<User> {
List<User> selectNative(UserQuery query);
}
咦~貌似和原始MyBatis沒(méi)有任何區(qū)別!
然后,PII是這樣子寫的(分頁(yè)參數(shù)必須放第一個(gè),第二個(gè)參數(shù)必須帶@Param注解):
public interface UserMapper extends BaseMapper<User> {
IPage<User> selectNative(IPage<User> page, @Param("query") UserQuery query);
}
嗯~看起來(lái)稍微麻煩一丟丟……
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原來(lái)的樣子!
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)礙眼了?
無(wú)疑PII更接近于JPA的寫法,但是耦合也更嚴(yán)重,而PH更加簡(jiǎn)潔。
【總結(jié)】
- 如果不打算手寫SQL,兩者差異不大;
- 如果需要兼容原生MyBatis的XML,或者將來(lái)可能換成其他MyBatis擴(kuò)展(比如通用Mapper),強(qiáng)烈安利PH!
BTW. 即使是非原生SQL的場(chǎng)景,PH也有優(yōu)勢(shì),比如對(duì)于多余的排序參數(shù)的處理。所以我的建議是:PageHelper+MP BaseMapper核心方法(除了分頁(yè))。
2022年1月27日編輯
自從體驗(yàn)了MyBatis Plus Generator(3.5.1版本)以后,我對(duì)代碼生成器有了很大的改觀,可以參考若依的BaseController.startPage()更加優(yōu)雅的實(shí)現(xiàn)分頁(yè),至于如何擴(kuò)展自己的模板生成DTO等,請(qǐng)移步后面的文章。
--- THE END ---