草庐IT

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

Java知识图谱 2023-04-17 原文

一、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付费进群(个位数),请注明来意。

有关MybatisPlus实战技术分享合集 代码生成器 多表连接查询 分组查询 一口气干完的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. python - 帮我找到合适的 ruby​​/python 解析器生成器 - 2

    我使用的第一个解析器生成器是Parse::RecDescent,它的指南/教程很棒,但它最有用的功能是它的调试工具,特别是tracing功能(通过将$RD_TRACE设置为1来激活)。我正在寻找可以帮助您调试其规则的解析器生成器。问题是,它必须用python或ruby​​编写,并且具有详细模式/跟踪模式或非常有用的调试技术。有人知道这样的解析器生成器吗?编辑:当我说调试时,我并不是指调试python或ruby​​。我指的是调试解析器生成器,查看它在每一步都在做什么,查看它正在读取的每个字符,它试图匹配的规则。希望你明白这一点。赏金编辑:要赢得赏金,请展示一个解析器生成器框架,并说明它的

  8. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  9. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params

  10. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

随机推荐