美文网首页后端
屠龙(JPA)倚天(MyBatis)号令天下,FluentMyb

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

作者: 稻草江南 | 来源:发表于2021-12-12 21:59 被阅读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. topNBy: 符合条件的前N条记录, N为对应的数字
      2. findBy, countBy, existsBy: 查询符合条件的记录、总数、true/false
      3. listBy, stdPagedBy, tagPagedBy, pagedBy: 列表查询、分页查询
    • 支持javax.validation字段约束处理
      image.png

    级联操作,1+N优化

    • 生成代码时, 支持设置1:1, 1:N关联关系
    • 支持懒加载方式,调用相应的关联接口才真正执行关联sql
    • 支持查询列表时,自动消除ORM的1+N的查询问题
      1. FluentMybatis在发起1+N关联查询时,会自动收集列表的关联外键列表,发起关联表的 IN (外键列表)查询,把1+N查询变为1+1查询。
      2. 同时,对关联数据自动按照外键在程序内存中进行分组,并把单个关联(列表关联)数据逐个赋值给列表中的元素
      3. 以上2个步骤都是自动完成,开发者只需了解原理,无需再进行繁复的编码操作,如丝顺滑。


        image.png

    查看测试控制台输出:


    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的解决方案

    • 通过Predicate方式

    • 通过直接布尔表达式方式


      image.png
    • 通过大对象断定 + lambada条件表达式


      image.png

    内嵌,子查询

    • from (Select 子查询)
    • exists (select 1 from ...)
    • IN (Select id from ... )
    • AND (1 或 2)
    • OR (1 且 2)

    请问,上述表达式是不是需要需要写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
    • 三表关联示例


      image.png
    • 嵌套子查询示例


      image.png
    • union示例


      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的文本块功能,会不会很爽。

    • customizedByPlaceholder


      image.png
    • customizedByQuestion


      image.png

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

    环境区隔,租户支持,分页支持,自定义主键支持,这些作为业务系统常用的功能点,当然一个也不能落下。
    通过实现接口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>
    
    • 入门有点点门槛,你需要稍稍了解Java的Annotation Processor工作方式

      Fluent Mybatis的很多代码时根据Entity文件通过Annotation Processor编译时生成的,在IDE上需要稍稍有点配置。
      idea上需要勾选上下列选项


      image.png

      Rebuild Project后


      image.png

      刷新Maven的工程视图


      image.png
    • 在eclipse中使用springboot整合fluent-mybatis

    相关文章

      网友评论

        本文标题:屠龙(JPA)倚天(MyBatis)号令天下,FluentMyb

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