美文网首页
MybatisPlus实战专题 多表查询 代码生成 分组查询 一

MybatisPlus实战专题 多表查询 代码生成 分组查询 一

作者: 赛先生和泰先生 | 来源:发表于2023-01-10 09:55 被阅读0次

    一、MybatisPlusMax简介

    MybatisPlusMax是MybatisPlus的增强包,秉承只拓展不修改的理念,对MybatisPlus做增强。

    正如MybatisPlus是对MyBatis的增强,MybatisPlusMax是对MybatisPlus的增强,拓展理念一脉相承。

    MybatisPlus依然进入软件成熟期,对其进行微小的修改会慎之又慎,向其提交修改PR周期较长,基于此考虑,为了更好的使用MybatisPlus,作者决定拓展第三方功能包。

    当MybatisPlusMax代码逐步成熟后,作者愿意一次性捐献给MybatisPlus官方团队,以方便用户更好的使用MybatisPlus。

    二、与MybatisPlus的渊源

    (一)MyBatis粉

    早期的作者也是MyBatis粉,如果你是从拼接SQL时代过来的,受够了在Java代码中拼接SQL字符串,那么MyBatis绝对让你爱不释手。

    随着MyBatis的重度使用,也暴露出一些问题:访问数据库极其啰嗦,单表CURD兜兜转转需要写一大堆代码,每个项目有很多张表,每个开发会做很多项目,此时的MyBatis从开发端来讲需要完善。

    (二)MybatisPlus初版

    MybatisPlus敏锐的发现MyBatis的痛点,着手对MyBatis重复业务代码进行封装,于是便形成了早期版本MybatisPlus。

    早期的MyBatisPlus字段名等魔法值充斥着Java代码里,并且为了构建查询条件,需要编写及其啰嗦的代码,很多MyBatis使用者对此嗤之以鼻。被喷的原因如下:大量的字段名魔法值充斥在Java代码里,与早期的拼接SQL字符串有何区别;非常简单的查询条件,在XML文件中很容易完成,使用MybatisPlus构造查询条件啰啰嗦嗦,不知所云。

    早期的MybatisPlus为了改进MyBatis的使用的想法是好的,可是在落地实践过程中带来了更大的问题,因此处于不温不火的状态。

    (三)MybatisPlus新生

    Java 8带来了Lambda表达式,为MybatisPlus重构代码带来了新的基础能力。MybatisPlus基于Java 8新特性进行代码重构,为其带来了新生,使用Lambda语法,干掉了Java代码里的字段名等魔法值,此时的MybatisPlus真正展示出吸引力。

    作者粉的是Lambda表达式版本的MybatisPlus,不管是查询条件的构建,还是字段的选取,均使用Lambda表达式(方法引用)来完成,Java代码变得清爽。

    方法引用性能

    使用方法引用来替换字段名,是否会产生性能问题呢?会也不会。会是因为经过一层包装,性能确实有损耗,不会是因为MybatisPlus在使用反射的地方使用了缓存,有效的解决了中间过程耗时操作,因此可以认为Lambda版的MybatisPlus的性能略有下降。用略微下降一点性能的代价置换开发的灵活性,这一点是值得的。

    况且现代服务器硬件逐年提高,从系统总体而言考虑,利大于弊。

    基于方法引用实现编码,在遇到代码重构是有多爽就不用多说了。小步快跑、敏捷开发等,造成的屎山代码不胜枚举,代码重构的地位变得愈发重要。

    三、作者的努力

    作者是MybatisPlus粉,因此在系统组件选择态度更为积极。

    (一)零SQL函数式编程时代

    在Lambda表达式加持下的MybatisPlus,零SQL函数式编程成为了可能。零SQL是只尽量少显示的编写SQL语句,能不写就不写,对于疑难杂症,退回使用MyBatis XML更为方便,此时也不能一条道走到黑。

    (二)MybatisPlusMax

    MybatisPlusMax不是新内容新,是从common包中抽离出来的代码,方便用户更好的使用和解藕。

    1、DAO缓存

    给DAO层透明化的增加缓存,能够极大的提高接口的响应效率,透明化意味着不知不觉间具备了缓存的能力,业务代码零感知。这里使用的是Redis分布式缓存,Redis是继Mysql之后必备的组件,因此默认缓存使用Redis分布式缓存。

    有关DAO更多内容,请查看视频教程增强MybatisPlus!一行代码整合Redis分布式缓存!

    2、自增自减零SQL编程

    通过自定义CustomLambdaUpdateWrapper包装器,实现零SQL编程。

    public boolean updateUserAge(Long userId) {
        CustomLambdaUpdateWrapper<User> wrapper = new CustomLambdaUpdateWrapper<>();
        wrapper.incr(User::getAge, 1).eq(User::getUserId, userId);
        return update(wrapper);
    }
    

    视频教程自增自减

    3、复杂业务报表

    通过封装WrapperUtils工具类,实现andor 交替出现时复杂业务报表查询。具体使用场景举例:

    ((industry = ?) OR (industry = ?)) AND ((round = ?) OR (round = ?) OR (round = ?))
    

    MybatisPlus·业务报表·复杂SQL

    (三)多表连接查询

    在我们使用Lambda风格搞定单表查询之后,因业务需要,多表连接查询必不可少!为此作者在此方面也做了不少努力,既然选择零SQL编程,那么便坚持到底。

    在这里需要说明几点,有不少声音认为,单表使用MybatisPlus,多表使用MyBatis,有这种想法的朋友可以更近一步,不然便是自欺欺人,挂着MybatisPlus之名干MyBatis之实。

    实际上,MyBatis使用join来完成连表查询,本身是有性能缺陷的,数据库数据量膨胀越来越快,join连表查询的弊端愈发明显。《阿里巴巴开发者手册》明令禁止使用join查询,你还在坚持什么呢?

    以Lambda版MybatisPlus单表查询为基础,通过Java内存拼装,完成多表连接查询是全新的选择。视频教程如下:

    (四)零SQL分组查询

    分组查询由于涉及到新增字段,因此普通的单表查询并不合适,不满足DO与数据库表结构一一对应的关系。作者通过对MybatisPlus源代码的阅读,找到了依然能够像单表查询的形式处理分组查询。

    视频教程

    (五)MybatisPlus代码生成器

    只要你想偷懒,那么Java代码生成器便是偷懒的利器,Java代码生成器以MybatisPlus为基础,通过在全局yml文件中复用数据库,读取数据库元数据信息,一件生成domain、mapper、service、controller等Spring MVC风格代码,以单表查询为主,兼顾多表连接查询,是你的开发好帮手。

    文字教程MybatisPlus代码生成器

    视频教程

    四、后记

    作者叫赛泰先生,主要技术分享平台在B站,是一位MybatisPlus粉,基于MybatisPlus做实战技术分享,希望能对喜欢MybatisPlus的你有所帮助。

    相关文章

      网友评论

          本文标题:MybatisPlus实战专题 多表查询 代码生成 分组查询 一

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