设为首页 加入收藏

TOP

MybatisPlus实战技术分享合集 代码生成器 多表连接查询 分组查询 一口气干完(一)
2023-07-25 21:41:26 】 浏览:65
Tags: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源代码的阅读,找到了依然能够像单表查询的形式处理分组查询。

视频教程

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JavaFx 页面和控件设置快捷键 下一篇Java方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目