Hibernate淘汰了?只是你不会用而已-程序员宅基地

技术标签: java  jar  hibernate  

不知道大家在整合SpringBoot+MyBatis有没有想过, 为什么SpringBoot不提供MyBatis的官方Starter呢?(可以查看SpringBoot官方提供的所有Starter并没有MyBatis的)你以为是为了和SpringDataJPA竞争?不不不~~

首先JPA(Java Persistence API )是JDK钦点的ORM规范,由Java官方提供出来的对象持久化的一套规范!!

那SpringBoot要做ORM框架肯定跟着JDK玩,毕竟JDK才是整个java的标准,所以才诞生SpringDataJpa. SpringDataJpa 的持久化操作实现默认用的依然是Hibernate.在Hibernate基础上构建了更多模板类以及易用性的改善。

Hibernate才是正统的JPA血脉!MyBatis?根本算不上ORM框架,不过是一个封装了JDBC的持久化框架(根本没有严格遵循对象持久化规范——即JPA规范)!SpringBoot我都不愿意跟你玩,你对标的应该是我的JDBCTemplate——都是直接操作sql,我Spring都有一个封装了JDBC的组件(JDBCTemplate)干嘛还跟你玩,你要跟我玩自己写Starter来适配我! 这才是真正的原因!

屏幕前的你

我知道你看完还是无法打动你,我们来比较一下Hibernate VS MyBatis:


Hibernate VS MyBatis

Hibernate 是一个对象关系映射框架 (ORM),它将 Java 类映射到数据库表。

MyBatis 是一个持久化框架——不是 ORM。它将 SQL 语句映射到 Java 方法。

为什么国人更偏爱MyBatis

总结原因:

1.你连JPA、Hibernate、ORM 都搞不清楚,还咋用Hibernate?Hibernate学习和使用门槛比MyBatis高

2.MyBatis简单易学上手快—符合培训机构的教学标准。培训机构都教MyBatis能不流行嘛!

3.中国特色的业务需求更复杂,使用MyBatis实现简单快捷。Hibernate要实复杂需求现难度更大!

4.为了无条件实现领导的需求,催生更加复杂的业务。需要面向领导编程,不得不选择更灵活的MyBatis。
5. 随着SSH的落幕,SSM的带动下。时代变迁\技术变更\大众选择

ps:那说来说去感觉还是应该MyBatis更好用啊..Hibernate还是被时代被社会环境抛弃了啊..虽然它确实有用又能怎么样呢?

但是

hibernate在实现一些需求单一的应用还是有它的优势的相较传统的Mybatis来说,持久层代码码少了60%,当然大部分都是体现在xml文件上,你无需花精力去维护你SQL语句,大大简化了持久层的开发、提升了开发效率。所以他们可以用于不同场景:


不同使用场景

Hibernate用于

  • 常规 CRUD功能、偏简单的业务需求 。
  • 编程方式由对象模型驱动—CodeFisrt。
  • 有更换数据库的需求。

MyBatis 用于

  • 编程方式由数据库驱动—DBFisrt。
  • 对SQL语句有极致的优化需求。
  • 对复杂的搜索查询,动态条件查询支持更舒服。

哦~~看样子他们各有各的好处,难不成我Hibernate和MyBatis混用?确实有很多应用这么干,但是我不建议在一个应用中混用,增加了应用架构的复杂度,但是如果一个应用可以拆成互不相干的小应用呢?各自小应用可以根据自己的业务复杂度选择自己所需的技术呢?


所以迎来Hibernate的又一春来了—— 微服务下结合SpringDataJpa

微服务架构下的关键就是:“拆!”,代码和数据库都会随之拆分,单个服务的业务复杂度也就降低了,随之SQL复杂度也就降低了,并且我每个服务可以自由选择自己的技术互不干涉,SpringDataJpa的用武之地毋庸置疑啊!


使用SpringDataJPA

SpringBoot下使用SpringDataJPA不要太方便:

  1. 只需加入对应springdatajpa依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2.添加Repository接口

结合dao层的Repository内置接口即可快速的CRUD,多种持久化方式供你自由选择,以下示例中7种:

public interface CustomerRepository extends 
PagingAndSortingRepository<Customer,Long>   //1.实现分页排序和CRUD
  // 需要实现动态条件也有很多内置接口可选择
, QueryByExampleExecutor<Customer>				  // 2.实现动态条件:快速精确匹配(查)
, JpaSpecificationExecutor<Customer>				// 3.实现动态条件:Specification(查)
, QuerydslPredicateExecutor<Customer>			  // 4.实现动态条件:Querydsl(查)
{

  // 5.还可以根据规定方法名进行快速定制持久化操作(查删)
  List<Customer> findByCustName(String custName);   // 即可生成SELECT * FROM Customer WHERE custName=?
  
  
  // 如果你想自定义语句查询,依然提供:
  // 6.通过JPQL进行持久化操作(增删改查)
  @Query("FROM Customer where custName=:custName ")
  List<Customer> findCustomerByCustName(@Param("custName") String custName);
  // 7.通过原生SQL进行持久化操作(增删改查)
  @Query(value="select * FROM tb_customer where cust_name=:custName ",nativeQuery = true)
  List<Customer> findCustomerByCustNameBySql(@Param("custName") String custName);

}

第5种更多规定方法名对照表:

使用:

直接调用持久化方法即可、无需依赖任何代码生成器

@Autowired
CustomerRepository repository;




// 1.PagingAndSortingRepository
repository.findById(20L);
// 5.规定方法名
repository.findByCustName("图灵");

// 4.通过QueryDSL可以进行复杂查询: 是不是跟SQL很像:
JPAQuery<Tuple> tupleJPAQuery = factory
  .select(customer.custId, customer.custName)
  .from(customer)
  .where(customer.custId.eq(1L))
  .orderBy(customer.custId.desc());
  
  
// ...更多方式可以学习springdatajpa课程

总结和展望

SpringDataJPA使用起来的感受就是一个字 “” ,它能快速的搭建起一个持久层,也不用像Mybatis一样太多的关心SQL。

其实在互联网项目中涉及到实时直接操作数据的场景会越来越少, 大多数都会通过缓存或其他NoSql存储(ES、MongoDB)、定时任务、MQ等技术 来为数据库减压。所以我觉得以后数据库的运用就应该是简单直接的。

所以推荐简单业务的应用和微服务架构下都可以采用SpringDataJpa,而MyBatis的则为实现那些复杂的ERP\OA等各种系统、为了应付领导各种复杂的需求才有它的用武之地。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Yh360311/article/details/123652381

智能推荐

Android 应用程序组件_android清单文件包含了组成应用程序模块所需要的组件-程序员宅基地

文章浏览阅读168次。应用程序组件是一个Android应用程序的基本构建块。这些组件由应用清单文件松耦合的组织。AndroidManifest.xml描述了应用程序的每个组件,以及他们如何交互。以下是可以在Android应用程序中使用的四个主要组件。组件 描述 Activities 描述UI,并且处理用户与机器屏幕的交互。 Services 处理与应用程序关联的后台操作。 Broadcast Receivers 处理Android操作系统和应用程序之间的通信。 Content Prov_android清单文件包含了组成应用程序模块所需要的组件

22.8.29 C语言作业5道_a.c: in function ‘main’:-程序员宅基地

文章浏览阅读387次。1.字符转换输出递归按位输出_a.c: in function ‘main’:

【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】_python蔡徐坤代码复制-程序员宅基地

文章浏览阅读6.9w次,点赞137次,收藏246次。表弟大周末的跑来我家,没事干天天骚扰我,搞得我都不能跟小姐姐好好聊天了,于是为了打发表弟,我决定用Python做一个小游戏来消耗一下他的精力..._python蔡徐坤代码复制

系统分析、设计_信息系统开发中分析与设计的重要性。-程序员宅基地

文章浏览阅读1.9k次。blueski推荐 [2007-1-31]出处:Java夜无眠作者:蔡学镛 1、系统分析是什么?   系统分析工作是解决一个问题的工作,目标是将一个对计算机应用系统的需求转化成实际的物理实现,其中复杂就复杂在实际的面太多.在系统分析过程之中注意问以下的问题,可能会所进行的系统分析设计工作有帮助。    1)您所完成的系统目的是什么?注意不是功能要求,而是目的.也就是为什么要建设、为什么要现_信息系统开发中分析与设计的重要性。

nginx 学习+案例练习_nginx 使用pipe:rollback-程序员宅基地

文章浏览阅读659次。nginx软件学习nginx是个web服务器,常用作静态文件服务器,反向代理服务器,邮件代理服务器,负载均衡服务器1.安装淘宝nginx,编代码编译安装,先解决模块依赖 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel..._nginx 使用pipe:rollback

python_one893.app-程序员宅基地

文章浏览阅读6.7k次。pycharm安装库包失败:比如安装matplotlib失败下载库文件:https://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib根据python版本等来选择适合的文件,比如python3.8选择cp38,python3.10选择cp310,这里我选择的是matplotlib‑3.4.3‑cp310‑cp310‑win_amd64.whl将下载好的文件放入python安装包的Scripts中,运行cmd命令行,执行pip install .\_one893.app

随便推点

回溯算法(leetcode 306 python)-程序员宅基地

文章浏览阅读295次。回溯算法:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回..._leetcode 306、python

redis的使用总结_redis.redis(host='127.0.0.1', port=6379)-程序员宅基地

文章浏览阅读352次。数据库redis使用优点使用方法redis的简单类型String字符串注意一个键最大能存储512MB哈希list列表set集合注意redis安全可以通过以下命令查看是否设置了密码验证用python实现链接数据库redis-connectredis密码破解redis使用设置数据添加数据redis查看服务器配置插入值追加数据setget数据导出dumprdb 这个即为_redis.redis(host='127.0.0.1', port=6379)

华为ICT解决方案助力全球190多家电力公司数字化转型-程序员宅基地

文章浏览阅读1k次。华为以“比特驱动瓦特,共建全联接智能电网”为主题,举办第七届华为全球电力峰会(线上),邀请来自全球各地的客户、伙伴、行业精英和思想领袖共同探讨。面对2020年的全球疫情、政治、经济等不确..._ict数字化解决方案资金分配

将图片资源文件整合到DLL文件中 _易语言dll加入资源-程序员宅基地

文章浏览阅读733次。 1、新建一个类库,例如库名为 ResourcesLibrary;2、添加引用 System.Drawing;3、添加资源文件(添加--新建项--资源文件),例如文件名为 Resource1.resx;4、添加图片(打开Resource1.resx,单击“添加资源”后的小三角,选择添加现有文件,选择需要作为资源的图片),例如添加了图片 Sunset.jpg5、添加类,例如名为 GetImage_易语言dll加入资源

MySQL 时间函数(答学生问:关于员工考勤查询)_%h:%i-程序员宅基地

文章浏览阅读4.4k次,点赞4次,收藏15次。今天有学生问个关于MySQL时间操作的问题,直接看图: 查询某日人员的出勤时间问题。我们都知道,企业员工考勤使用打卡方式,每天会记录每个员工的多次打卡记录,最后取每个员工的每天:上班时间:当日最早时间;下班时间:当日最晚时间。所以分析查询每个员工每日考勤记录,需要根据员工分组,当天时间、时间最小和最大,时间格式化等操作,下面举例模拟该问题:学生表student ..._%h:%i

Python实战——1_1.网页制作_"<nav> <ul class=\"summary\"> <!-- 一级目录 --> {% for-程序员宅基地

文章浏览阅读1.3w次,点赞4次,收藏31次。Python实战——1_1.网页制作引言网页的组成部分:CSS样式 - 给结构以装饰Html - 结构部分JavaScript- 功能实现代码部分第一部分为网站的基本结构(在IDE中新建网页后既给出) {% for docs in toc_list %} "

推荐文章

热门文章

相关标签