首页 > 其他分享 >关于Mybatis 和 Hibernate 持久层框架之间的区别

关于Mybatis 和 Hibernate 持久层框架之间的区别

时间:2023-08-17 23:02:30浏览次数:38  
标签:Hibernate 持久 框架 映射 对象 SQL Mybatis

首先,Mybatis 和 Hibernate 都是 ORM 持久层框架

不同点在于,MyBatis 是半自动的,它需要开发人员自己手动编写 SQL 语句。

一、Mybatis

MyBatis 支持通过 XML 或注解的方式来配置需要运行的 SQL 语句,并且,最终由框架本身将 Java 对象和 SQL 语句映射生成最终执行的 SQL ,执行后,再将结果映射成 Java 对象返回。

相较于 Hibernate, Mybatis 因为可以编写原生的 SQL ,也就是说,能够严格控制 SQL 执行性能,灵活度高。

但是灵活的前提是 MyBatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套 SQL 映射文件,工作量大。

PS: 现在一般借助于一些自动化的插件,来帮我们自动生成相关代码,极大地提升了开发效率。还可以使用 MyBatis-Plus 框架,内部集成了常用的 SQL 操作,也是非常不错的。

二、Hibernate

再来说说 Hibernate, 它对象/关系映射能力强,能做到数据库无关性。如果用 Hibernate 开发,无需关系 SQL 编写(不会写 SQL 的人都可以操作数据库),能节省很多代码,提高效率。

但是 Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。

插一句: JPA 是基于 Hibernate 的一层封装,也就是说底层还是 Hibernate.

三、如何选型

结合公司业务,选取最适合的框架,不要为了技术而技术,否则都是耍流氓。

比如说,你所在的是相对来说较小的公司,数据量并不大,且公司开发人员的技术栈偏 Hibernate 多一些,推荐使用 JPA、Hibernate 这些无需手动编写 SQL 的持久层框架,提高开发效率、版本迭代速度。

如果说,你所在的是一家互联网公司,用户数较大,对相关 SQL 执行性能要求较为严格,则推荐使用 Mybatis。

总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

四、总结

Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取。

Mybatis 属于半自动 ORM 映射工具,在查询关联对象或关联集合对象时,需要手动编写 SQL 来完成。

标签:Hibernate,持久,框架,映射,对象,SQL,Mybatis
From: https://blog.51cto.com/u_16214567/7128300

相关文章

  • mybatis-plus+nacos配置中心和服务发现保姆级教程
    默认你已经看了我的Mybatis-Plus+Mysql的教程,现在有了一个简单的项目如下(之前的教程: https://www.cnblogs.com/leafstar/p/17638741.html)1.下载nacao,我这里下的是2.1.0版本提供一下我用的版本(链接:https://pan.baidu.com/s/1AVmZIhx4b0euzctJhWUlTQ?pwd=1234提取码:1234......
  • 「Note」数据结构方向 - 可持久化数据结构
    1.可持久化线段树1.1.介绍可持久化线段树一般用于解决区间第\(k\)小值的询问。首先考虑简化过的问题,区间\(\left[1,r\right]\)的第\(k\)小值。考虑用权值线段树(离散化或动态开点)来求\(k\)小值,接下来只需要解决区间的问题。可持久化线段树核心思想:每次插入值时保留......
  • SpringBoot+Mybatis-Plus+Mysql的保姆级搭建
    本文通过简单的示例代码和说明,让读者能够了解Mybatis-Plus+Mysql的简单使用必须说明的是,本文有部分内容是为了后续的微服务写的,所以如果只想用Mybatis-Plus的话,直接使用bank1项目即可 1.新建父项目,选用springinitializr即可,可以删除其他文件,仅仅留下pom文件当成父pom。修改......
  • MyBatis resultMap中collection过滤空字段
    在使用MyBatis查询数据时,返回值可以定义为resultMap。如果返回的对象中有列表,还可以使用collection标签进行定义。此时,如果不想某些字段为空的数据加入列表,可以使用notNullColumn属性进行定义:<resultMapid="resultMapDemo"type="返回值类型"><idproperty="id"column=......
  • mybatis自定义拦截器@Intercepts
    mybatis:自定义实现拦截器插件Interceptor-知乎(zhihu.com) 11.插件机制Interceptor|一灰灰Learning(hhui.top)......
  • IDEA社区版+SpringBoot+MyBatisPLus+MySQL实现数据库的保存、查询、修改操作
    一、概述使用IDEA社区+SpringBoot+MyBatisPlus+MySQL实现数据的保存修改与查询。主要记录一下踩坑过程。注意事项:1.社区版IDEA并不能直接创建SpringBoot工程,所以我采用的方式是在Spring官网上,让其帮助我创建一个,创建好后,直接下载。//参考案例https://blog.csd......
  • Docker数据持久化与数据共享
    上篇文章的最后我们使用Docker部署了一个纯前端项目,但还有一个很重要的问题就是容器中产生的数据(比如log文件),容器一旦被删除,容器内的所有数据也就没有了,为了避免这个问题我们可以将数据存储到容器之外(比如宿主机),这样即使删除容器也不会丢失数据。一旦容器故障,我们可以重新创建一个......
  • 谈谈你对Mybatis的认识/了解?
    概念:Mybatis是一个开源免费轻量级,基于Java语言、半自动ORM、持久层的框架作用:封装了JDBC,通过SOL语句建立实体类和关系表的映射关系,让我们操作数据库更加简单、方便、高效使用步骤:1)导包导入Mybatis相关依赖包 2)配置数据库连接yml3)代码实体类OMapper接......
  • mybatis 参数赋值及类型解析
    基本类型处理器configuration对象初始化的时候会创建TypeHandlerRegistry,构造方法里指定了默认类型处理。基本类型常见的数据库类型都又对应的解析器。TypeHandlerRegistry类typeHandlerMap属性存储了javaType和类型TypeHandler之间的映射关系。这里的mapkey值就是javaType对应......
  • mybatis动态查询Integer类型入参为0不生效的问题
    解决//Integer类型入参,动态sql判断只需要判null即可<iftest="status!=null">andstatus=#{status}</if>原因mybatis源码在预编译sql时,使用OGNL表达式来解析if标签,对于Integer类型属性,(status!='')会当作(status!=0)来判断 ......