后端

屠龙(JPA)倚天(MyBatis)号令天下,FluentMyb

2021-12-12  本文已影响0人  稻草江南

前言

在java的orm江湖中,腥风血雨,诞生出过很多门派。

  1. 野球拳十段高手, 追求返璞归真,JDBC API和Spring JdbcTemplate追求者。


    image.png

除了野球拳派之外,还有2大江湖传说!

  1. 屠龙宝刀拥有者Hibernate(JPA): 有自动跟踪功能,一按按钮,自动映射,级联查询,但有时候导航不准,不知道命中了啥目标。HIbernate是一代大哥,Spring Data JPA继续发扬光大其法力。


    image.png
  2. 倚天宝剑拥有者ibatis(MyBatis): MyBatis在国内互联网界,呼风唤雨,毒霸天下。在带头大哥Mybatis的号召下,其旗下有一众迷弟: TkMybatis、mybatis-plus、fastmybatis、mybatis-enhance、Ourbatis、mybatis-pro ... ...


    image.png

    倚天和屠龙的纠纷,由来已久,它们究竟谁更牛掰点,江湖上有各种传说:

    1. 为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
    2. MyBatis还是JPA? 终于有答案了!
    3. 浅谈mybatis和jpa的区别

    总之,各种爱恨情仇。然就国内而言,MyBatis以其号称的半自动化特性,迎合了国内业务模型设计混乱,时不时复杂多表join、各种骚操作的现状,也号称DBA可以帮助REVIEW SQL, 不会陷入到hibernate(JPA)自动导航的谜之操作陷井中;

    但也因其半自动化,孜孜不倦的码农们,前仆后继的将其致力于更加自动化,让码农们提高工作效率(内卷)。

    在MyBatis的一位新晋迷弟中,fluent mybatis在机缘巧合中,静坐冥思7天7夜,悟出了屠龙和倚天的秘密,将二者合二为一,取出了藏于其中的九阴九阳。

    image.png

FluentMybatis的功力

根据方法名称自动实现数据操作 + 参数注解校验

级联操作,1+N优化

查看测试控制台输出:


image.png
  1. 只执行了2条SQL语句, 符合1+1预期,避免了1+N问题
  2. 2条SQL各返回2,4条记录,框架进行了数据分组和赋值处理

条件设置,条件WHERE, 江河虽大,只取一瓢

在业务编码的世界中,输入的条件往往是多变的,有很多的组合关系,这时候,如果你固守野球拳式的JDBC(或template)编码,前面将是无尽的炼狱。这时候,java的if else语句,jpa的Criteria,mybatis的Example,或者mybatis xml的 <if> 标签就将闪亮登场。

漫漫长夜,无心睡眠,我以为只有我睡不着,原来晶晶姑娘也睡不着!


image.png

既然睡不着,我们来探讨探讨技术问题,切磋一下FluentMybtis的解决方案

内嵌,子查询

请问,上述表达式是不是需要需要写mybatis的原生的xml表达式,否则会很复杂???

No,No,No,不需要的,FluentMybatis支持的很好,一发入魂!


image.png
image.png
image.png
image.png
image.png
image.png

执子之魂,与子共生:join的结合和union合并

除了写原生的SQL,ORM框架一般都没提供join和union的编码功能,因为复杂,但fluent mybatis做到了简单。


image.png

充血模型,心中有剑手中无剑

弱冠之年成名,手持青钢利剑,曾与河朔群雄争锋。三十岁之前,使用紫薇软剑,威力巨大,曾误伤义士,弃剑于深谷。之后改用重剑,重剑无锋,大巧不工,荡尽天下高手,横行江湖。四十岁之后,花草树木皆可当作兵器,无招胜有招,手中无剑心中有剑,也就是剑气伤人的境界了。

对于简单的,根据Entity值条件进行的操作,忘掉Mapper、Query和Update吧。RichEntity上内置了很多充血的操作,可以自动组装SQL,调用Mapper执行操作。

image.png
image.png
也可以直接通过Query和Update直接触发Mapper的sql操作,无需再关注Mapper的存在。尽量做到简化编码,简而又简,化有形于无形。
image.png

隔山打牛,从rest api直接透杀到数据库

江湖之中,除了武功招式,还有很多门派,立有众多的规矩。分层设计,DDD设计,想进入java的殿堂,岂有不拜码头的道理!!!


image.png image.png

但对于后台的增删改查界面,需要做以下事情

  1. 定义API入参,出参;定义参数约束;
  2. 定义Controller层,调用Service层
  3. 定义Service层,调用Dao(Mapper)层
  4. 调用BeanUtils或者MapStruct,把数据库模型转换为业务模型

姑奶奶好,为什么我总在重复的搬砖啊,为什么Java的框框条条这么多,为什么不能像PHP一样,直接操作数据库搞定一切呢。为什么?为什么?为什么?

image.png

别急,FluentMybatis给你一杆到底,只需声明,无需编码(搬砖):和PD讨论完需求,把产品的PRD原型设计一下接口,就可以偷懒喝咖啡的选择。

image.png

DEV: 老板,我收工了!

TL: 你只是定义了API规格啊,还有实现呢?

DEV: FluentMybatis已经帮我完成了,只需要引用一下接口实现就ok了


image.png

TL, 目瞪口呆ing......


image.png

Free Query/Update, 我花开尽百花杀, 野球拳十一级

任你说的天花乱坠,业务的世界你不懂,总有你兜不住的时候。😌,既然兜不住,360计走为上计。 但我能不能走的优雅点!直接使用Mybatis的xml,当然可以。不过FluentMybatis也提供了一个原生文本sql编码的方式,如果配合JDK17的文本块功能,会不会很爽。

什么,环境支持?租户支持?当然不在话下

环境区隔,租户支持,分页支持,自定义主键支持,这些作为业务系统常用的功能点,当然一个也不能落下。
通过实现接口IDefaultSetter,并在代码生成时设置实现接口就可以了!


image.png
image.png

甚至,你还可以把FluentMybatis当做一个简单的分表中间件使用!


image.png

重要的是,要言而有信,Fluent! Fluent! Fluent Style,行云流水,如丝般的顺滑

<dependency>
    <groupId>com.github.atool</groupId>
    <artifactId>fluent-mybatis</artifactId>
    <version>1.9.3</version>
</dependency>
<dependency>
    <groupId>com.github.atool</groupId>
    <artifactId>fluent-mybatis-processor</artifactId>
    <version>1.9.3</version>
    <scope>provided</scope>
</dependency>
上一篇下一篇

猜你喜欢

热点阅读