持久层框架JPA与Mybatis该如何选型(1),程序员如何技术划水

                    " WHERE stu_id = ? ",

            resultClass = Student.class

            )

})

@Table(name=“student_info”)




以上的这部分实现还没有考虑到动态SQL的问题,如果考虑到动态SQL,写法会更复杂。**所谓的动态SQL就是:根据传入参数条件的不同,构造不同的SQL**,很多的比较这两个框架的文章都忽略了动态SQL的问题,这方面Mybatis支持的更好。Mybatis写的动态SQL说到底还是SQL,而不是java代码或者java代码拼字符串。程序员特别排斥几件事:



*   将复杂关联关系的SQL写在java代码里面,拼串书写不方便

*   SQL是最能表达实体关系查询的语言,程序员不希望使用异化SQL语言。

*   程序员不希望学习不通用的东西,显然SQL大家都会

*   JPA虽然将大部分操作封装起来了,也挺好用的,但是SQL调优怎么做?



> 可以使用Spring-Data-JPA-extra解决JPA的拼串书写和SQL异化的问题。但是根据笔者的使用情况,Spring-Data-JPA-extra是一个个人开发者项目,用于生产还很不成熟,对于多数据源处理、复杂类型处理等还有很多的问题。



二、劣币驱逐良币?

---------



![](https://img-blog.csdnimg.cn/20191104084053748.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhbnhpYW90b25ndG9uZw==,size_16,color_FFFFFF,t_70)



然而,另外有一派观点,你看人家国外的程序员怎么都用JPA?你不去学习新东西,还不让别人用?JPA使用很方便啊,唯一缺点就是复杂关联SQL支持差一点,但是只要你学一下也还可以支持啊,你们这是劣币驱逐良币。如果经过很好的实体关系模型的设计,JPA显然是最优解,程序员写的SQL还真不如JPA根据实体关系生成的SQL。笔者要说,这种观点也是有道理的。但是,笔者要说并不是国内程序员不愿意学习,而是另有原因。



*   首先,笔者长年从事远程工作,与国外程序员接触较多。他们习惯使用JPA的一个原因,真的是因为他们国家的应用规模太小了,比起国内的一个应用动则上百万的用户相比,他们在数据库设计与调优的需求上显然更从容。

*   国外的应用设计往往更简洁,而国内的应用需求往往功能性更强。如果不信,你可以去看看工作流,什么会签、流程回退什么的都是我们发明的,他们没有。你让他们用JPA写一个我们的工作流应用试一试,累吐血他们也做不到。

*   异化SQL或者代码里面写SQL,一定程度上增加了学习成本和使用成本。所以用的人少,用的人少你就得迁就团队中的大部分人。



说完以上几点,Mybatis为什么在国内会有如此多的使用者及使用厂商就不难理解了。Mybatis还可以使用如:Mybatis-plus或者代码自动生成来弥补易用性上的不足。JPA的身材、家室、性格样样都是满分,就是脸长得磕碜点难以处理社交关系。Mybatis虽说在各方面都不优秀,身材还可以、样貌也还说得过去、性格也还好。关键是你说什么都听你的,还有愿意帮他化妆的朋友。要你说你选哪一个?



那么,有的人会说,你这是抬杠?国外就没有受众数量多、功能性强的互联网应用了么?恐怕比国内还多吧,这个也是事实。但是从比例上讲还是国内更多,比例决定开发人员选择技术的方向。这也导致了一个惯性思维,他们平时就用JPA学习训练,所以写大型服务应用的时候也用JPA。那么,他们写JPA会写复杂SQL么?答案是很少会用到,甚至有的国外公司就明令禁止写关联查询SQL。那怎么办?不用关联SQL怎么开发业务需求?不会啊。



三、服务拆分或微服务

----------



![](https://img-blog.csdnimg.cn/20191104084053935.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhbnhpYW90b25ndG9uZw==,size_16,color_FFFFFF,t_70)



国内现在也有越来越多的公司,进行微服务的落地,然而真正落地比较好的企业少之又少。这和多表关联查询有什么关系?我们先来实现这样一个需求:查询属于A角色相关的所有的业务B数据。



*   如果我们开发的是传统的单体应用,我们可能是把角色表A和业务表B进行关联查询,然后得到查询结果

*   如果我们做的是微服务,我们可能是拆分为权限服务A、业务服务B。先去访问A服务接口获取角色标志信息,然后再根据角色标志信息去业务服务B接口获取业务数据。



那么有的人会说,访问两个接口一定比访问一个接口更慢吧!这个真的不是,如果我们做微服务,一定是我们的应用规模及数据量到达了一定程度。也一定会考虑分表分库、负载均衡、服务拆分细化等问题,当分布式的开发方式被应用越多,多表关联查询使用的机会也就越少。拆分后的服务由于功能单一、负载分流等原因,访问速度往往比大数据量数据集中存储、多服务集中部署的应用会快很多。



问题回来了,不用关联SQL怎么开发程序?总的来说就是通过合理的服务拆分、应用的界面数据的组织关系的合理的设计,团队拥有比较好的微服务落地经验,是可以实现不使用关联查询SQL开发应用的。大家也知道,NOSQL越来越流行,绝大部分的NOSQL数据库都没有所谓的关联关系。



四、框架对比选型

--------



总结一下笔者的观点:



*   如果你是自己开发“小而美”的应用,建议你使用JPA

*   如果你是开发大而全的企业级应用,当然要遵从团队的技术选型。这个技术选型在国内通常是Mybatis。

*   如果你们公司的管理非常规范,微服务落地经验也非常成熟,可以考虑在团队项目中使用JPA。少用或不用关联查询。



期待您的关注

------



*   博主最近新写了一本书:[《手摸手教您学习SpringBoot系列-16章97节》]( )

*   本文转载注明出处(必须带连接,不能只转文字):[字母哥博客]( )。





**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/df31c1a6e76539aa124273607f770f2a.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/924e6b5d4de1ded02d11925decc16372.png)
![img](https://img-blog.csdnimg.cn/img_convert/eed46661a6ac3b5a5278f7b0102757df.png)
![img](https://img-blog.csdnimg.cn/img_convert/6edc4e8d76b2317a51cc2529dcd0cb4f.png)
![img](https://img-blog.csdnimg.cn/img_convert/1f9fef89f6386aae3cd53e70cc7169ba.png)
![img](https://img-blog.csdnimg.cn/img_convert/8e529cdc2f7e22443ed3f1d22fa41606.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)**
![img](https://img-blog.csdnimg.cn/img_convert/ce22fd2faa2e96d44aa6a1e2bade7fe8.jpeg)



# 最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

**目录:**

![全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)](https://img-blog.csdnimg.cn/img_convert/19a56e4579692fff7d831665f129807f.webp?x-oss-process=image/format,png)

Java面试核心知识点

**一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**

![全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)](https://img-blog.csdnimg.cn/img_convert/c8975e30808a348f04a2a304f3da2e8b.webp?x-oss-process=image/format,png)

Java面试核心知识点

**已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了**

![全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)](https://img-blog.csdnimg.cn/img_convert/1b355335f3a1501d59e73bd9443a8c07.webp?x-oss-process=image/format,png)


搜刮资料自己整理的时间!**

[外链图片转存中...(img-wNnhzxzs-1712031297983)]

Java面试核心知识点

**已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了**

[外链图片转存中...(img-RGR4G9iG-1712031297984)]


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值