MybatisPlus实战技术分享合集 代码生成器 多表连接查询 分组查询 一口气干完

一、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技术学习群,添加微信dream4s付费进群(个位数),请注明来意。

posted @ 2023-01-10 14:31  赛泰先生  阅读(1229)  评论(0编辑  收藏  举报