知乎高赞:Spring Data JPA 和 MyBatis 谁更强?

我无法明确的告诉你JPA和Mybatis在国内哪个会更流行,我本人更喜欢JPA,但是我本人日常开发用MyBatis多。

但是我的回答绝对不是在划水,而是我多年来自己的一点小小的思考。MyBatis用好了就是神!用不好就特么一坨……并且,这个框架只有两个结果,要么就是用的好,要么就是用不好……

而JPA,用不好,比MyBatis还一坨……但是用好了,那是超越神的存在,因为你已经完全脱离了事务脚本。

有没有更牛逼的?

有,但是现实中你基本遇不到这样的大神,因为这样的大神在成为大神之前,要么早就财务自由了,要么就转管理了。

国内大多数项目其实根本没有设计过程,都是想到哪儿写到哪儿,别说领域模型的设计了,就连OOP都没有,都是披着OOP的外壳在写过程。

当然这是大环境所逼迫的,并不是程序员、架构师所能左右的,大环境就很浮躁,就认为一个月能开发出一个支付宝,你没办法去抗衡它,大家都要吃饭的嘛,我为什么要打击别人的梦想呢?只要您给钱,我就尽量满足您。

我(曾经)非常愤恨这种劣币驱逐良币的环境,本来大家都是安心做设计,然后水到渠成的进行开发,客户也是和和气气的跟开发进行商讨,结果有些人念歪了敏捷的经,更有甚者,读了一本《人人都是产品经理》就真的认为自己是个非常牛逼的产品经理了。

都特么一群….

千万不要自信的认为,前三十年的懒惰,通过一两本书就能解决自己知识的匮乏。

结果就是导致现在大家都不喜欢静下心来搞设计,而是喜欢不管三七十二一先冲山头再说,稍微有点前瞻性的考虑都认为你是过度设计。

  • 你跟他说制定作战计划。
  • 毛的的作战计划,全都给我上,见招拆招,逢人便打就对了。

仔细一想,好像也没说错什么……

但是如果重心放在设计上,那么自然JPA在OOP上比MyBatis优秀太多太多了。

封装、继承、多态抽象、接口、实现

一说到OOP,大家都信手拈来,甚至什么贫血模型、充血模型、胀血模型都跟你说的头头是道,但是一涉及到实际开发全都抛到脑后去了。

仔细想想,有多久没有写类似下面这种代码了?(随便写着玩的,Lombok仅为减少代码行数)

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name="uaa_account")
@Entity
public class Account {
    /* 状态 */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;

    /* 构造 */
    private AccountRepository accountRepository;

    public Account(AccountRepository accountRepository) {
        this.accountRepository = accountRepository;
    }    

    /* 行为 */
    public void login(LoginCommand command) {}
    public void register(RegisterCommand command){}

    /* 事件驱动 */
    @PostPersist
    public void emmitEvent() {}
}

再说一个让很多开发感到恐惧的事情:

public abstract class AbstractDomain {
    @Getter
    protected final String attr;

    public AbstractDomain(String attr) {
        this.attr = attr;
    }
}

试问一下,你有多久没有写抽象类和受保护的状态了?final 这个关键字,如果没有Sonar,大家是不是快把它给忘记了?

只读属性究竟意味着什么还记得吗?Collections.unmodifiableList() 不可变集合到底用来干嘛的?我估计90%的开发都没用过这个玩意儿吧?

知乎高赞:Spring Data JPA 和 MyBatis 谁更强?

约书亚·布洛克(英语:Joshua J. Bloch,1961年8月28日-),美国著名程序员。他为Java平台设计并实作了许多的功能,曾担任Google的首席Java架构师(Chief Java Architect)。

2001年出版Effective Java,获得2001年Jolt奖。詹姆斯·高斯林曾表示相当赞赏此书。

大神的代码随处可见,你离大神就是那么的近。

  • SOLID五大原则,你是否已经忘记的一干二净了?

  • 你的代码是否只有分层,而没有模式?

  • 23种设计模式,随口能说五六个,但是这五六个都用来解决什么问题的,有没有仔细思考过?

我从2018年开始负责面试,到今年已经接近三年了,期间从HR提交过来自己走眼的简历至少两千份,现场面试差不多有四百人,能把设计模式和面向对象说清楚的,寥寥无几。

现在大家的重心都是怎么快速的冲锋,前面三个山头,也不给你一个具体的目标,反正你给我冲,冲到哪里咱不管,起码你冲了。

于是我们可以看到99%的代码结构就是:

  • Controller – 几乎没代码
  • Service – 重灾区
  • Utils – 重灾区
  • Entity – 跟VO有啥区别?
  • Repository 或 Mapper 或 Dao – 几乎没代码
  • Mapper.xml – 证明我是SQL小王子的时候到了
  • Test – What? 这干嘛的?

Service太重了,随便翻开一个Service,里面的代码一大堆。

不信随手翻一下现有的项目,超过一千行的Service是不是到处都是?

我形容这种开发为猪突式开发

那么这个时候,MyBatis牛逼的地方就显现出来了。

幸好还有个Spring框架如果没有Spring框架,什么OOP,扯犊子呢?抓紧往上怼怼怼怼代码,怼完拉倒。

框架是为了简化开发任务,让你有更多的时间去做程序设计和逻辑架构。所以,哪个会更流行取决于大环境,而不是开发人员。我本人是更喜欢先设计,后开发的。

但是我同样是一个有同情心的人,我不忍心破坏别人想当一个架构师的梦想,虽然他可能一行代码都没写过,我依然支持他,当然前提是该背的锅你得背,该我的钱一个子儿都不能少。

说些题外话

我个人有三种开发方式,第一种是前端驱动,第二种是后端驱动(好像说的是废话……),第三种是数据驱动

前端驱动顾名思义,就是做一个项目,前端先上,前端根据设计稿和产品文档实现了UI之后,后端再根据前端UI去设计后台架构。这么做的好处在于无论是客户还是开发,都能面向一个具体的页面进行需求讨论和架构设计,最终实现结果不会跑偏。

前端的开发速度是比后端快的,因此在发生需求变动的时候,响应速度也非常快,实在有一些比较难处理的UI,例如需要Canvas绘图的地方,通过口头(或文档)补充即可。但是这种方式只适合一些面向客户的小项目,而不是面向产品的项目,就是说客户要什么就给他什么,他要一匹马,你就别给他设计一辆车,到时候吃力不讨好。

这种类型的项目,MyBatis最合适。

如果一个项目非常大,例如从头开始设计一个B2B的交易平台(包括后台ERP)产品,就不能采用这种方式。

因为采用这种方式的坏处在于他不能站在高处俯瞰全貌,都是一点一点的往上堆砌,就是大家常说的摸着石头过河,最终会导致抽象不足,代码冗余,重构成本高,维护成本高,数据孤岛严重,子系统甚至是子模块业务互斥,向着恶性循环发展,最终项目变得越来越庞杂,无数的内耗产生。

大的项目,一定要从数据建模开始设计,一定是后端驱动,要认真仔细的思考每一个细节,先做抽象设计,然后具象到模块,再由模块具象到每一个实体、接口。

当这一切都设计好了之后,开始模拟数据流转,注意,此时还没有开始写一行代码。

数据流转通畅之后,剩下的编码只是水到渠成的事情,编码过程根本不重要。而这么做,JPA是最合适的。

但是,大部分土老帽认为程序设计是一件很low bee的事情,别笑,真事儿,因为他们认为不需要你来设计,他们自己就能设计好,你所要做的就是把他们“设计”好的东西用代码实现就好了。

他们最喜欢听的一句话就是:

嗯!老板说得对,小的马上就去写代码!

而不是:

老板,我觉得这个地方需要重新设计一下。

最后一种,是数据驱动,这种开发方式也很常见,最明显的就是报表以及大部分挂羊头卖狗肉的大数据处理,因为就这些数据,你很难去做后端驱动,你设计的再好,数据就是缺失的你没办法。

所以数据驱动,MyBatis也是比较合适的,JPA可能不太合适。

来源|zhihu.com/question/317183937/answer/1474629982

后端专属技术群

构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!

文明发言,以交流技术职位内推行业探讨为主

广告人士勿入,切勿轻信私聊,防止被骗

知乎高赞:Spring Data JPA 和 MyBatis 谁更强?

加我好友,拉你进群

原文始发于微信公众号(Java知音):知乎高赞:Spring Data JPA 和 MyBatis 谁更强?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154299.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!