美文网首页
PageHelper还是MyBatis Plus自带分页插件?

PageHelper还是MyBatis Plus自带分页插件?

作者: iakuil | 来源:发表于2021-07-14 08:52 被阅读0次

    在座CRUD boy肯定对各种分页方式熟稔于心,那么,有没有思考过为什么用它?有什么优缺点?性能如何?
    就拿MyBatis Plus(以下简称MP)自带的PaginationInnerInterceptor(真特么长,以下简称PII)和PageHelper(以下简称PH)来比较,你更中意那种?


    假设有一个非常复杂的分页查询场景,需要在XML中手写原生SQL,PH的Mapper会是这样子的:

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

    咦~貌似和原始MyBatis没有任何区别!

    然后,PII是这样子写的(分页参数必须放第一个,第二个参数必须带@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,条件一多,是不是就有点碍眼了?

    无疑PII更接近于JPA的写法,但是耦合也更严重,而PH更加简洁。

    【总结】

    • 如果不打算手写SQL,两者差异不大;
    • 如果需要兼容原生MyBatis的XML,或者将来可能换成其他MyBatis扩展(比如通用Mapper),强烈安利PH!

    BTW. 即使是非原生SQL的场景,PH也有优势,比如对于多余的排序参数的处理。所以我的建议是:PageHelper+MP BaseMapper核心方法(除了分页)。


    2022年1月27日编辑
    自从体验了MyBatis Plus Generator(3.5.1版本)以后,我对代码生成器有了很大的改观,可以参考若依的BaseController.startPage()更加优雅的实现分页,至于如何扩展自己的模板生成DTO等,请移步后面的文章。

    --- THE END ---

    相关文章

      网友评论

          本文标题:PageHelper还是MyBatis Plus自带分页插件?

          本文链接:https://www.haomeiwen.com/subject/crpspltx.html