在座CRUD boy肯定對各種分頁方式熟稔于心鞠抑,那么,有沒有思考過為什么用它忌警?有什么優(yōu)缺點搁拙?性能如何?
就拿MyBatis Plus(以下簡稱MP)自帶的PaginationInnerInterceptor(真特么長法绵,以下簡稱PII)和PageHelper(以下簡稱PH)來比較箕速,你更中意那種?
假設(shè)有一個非常復(fù)雜的分頁查詢場景朋譬,需要在XML中手寫原生SQL盐茎,PH的Mapper會是這樣子的:
public interface UserMapper extends BaseMapper<User> {
List<User> selectNative(UserQuery query);
}
咦~貌似和原始MyBatis沒有任何區(qū)別!
然后徙赢,PII是這樣子寫的(分頁參數(shù)必須放第一個字柠,第二個參數(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
募谎,條件一多扶关,是不是就有點礙眼了?
無疑PII更接近于JPA的寫法数冬,但是耦合也更嚴重节槐,而PH更加簡潔。
【總結(jié)】
- 如果不打算手寫SQL拐纱,兩者差異不大铜异;
- 如果需要兼容原生MyBatis的XML,或者將來可能換成其他MyBatis擴展(比如通用Mapper)秸架,強烈安利PH揍庄!
BTW. 即使是非原生SQL的場景,PH也有優(yōu)勢东抹,比如對于多余的排序參數(shù)的處理蚂子。所以我的建議是:PageHelper+MP BaseMapper核心方法(除了分頁)。
2022年1月27日編輯
自從體驗了MyBatis Plus Generator(3.5.1版本)以后缭黔,我對代碼生成器有了很大的改觀食茎,可以參考若依的BaseController.startPage()更加優(yōu)雅的實現(xiàn)分頁,至于如何擴展自己的模板生成DTO等馏谨,請移步后面的文章别渔。
--- THE END ---