MyBatis与JPA的区别是什么
MyBatis分为全注解版和xml版;全注解版适合于小项目,直接在方法上加注解,在注解中写sql
仓储
Repository 模式是领域驱动设计中另一个经典的模式。在早期,我们常常将数据访问层命名为:DAO,而在 SpringData JPA 中,其称之为 Repository(仓储),这也不是巧合,而是设计者有意为之。
熟悉 SpringData JPA 的朋友都知道当一个接口继承 JpaRepository 接口之后便自动具备了 一系列常用的数据操作方法,findAll, findOne ,save等。
那么仓储和DAO到底有什么区别呢?这就要提到一些遗留问题,以及一些软件设计方面的因素。在这次SpringForAll 的议题中我能够预想到有很多会强调 SpringData JPA 具有方便可扩展的 API,像下面这样
public interface OrderRepository extends JpaRepository<Order, String>{
findByOrderNoAndXxxx(String orderNo,Xxx xx);@Transactional
@Modifying(clearAutomatically = true)
@Query("update t_order set order_status =?1 where id=?2")
int updateOrderStatusById(String orderStatus, String id);
}
但我要强调的是,这是 SpringData JPA 的妥协,其支持这一特性,并不代表其建议使用。因为这并不符合领域驱动设计的理念。注意对比,SpringData JPA 的设计理念是将 Repository 作为数据仓库,而不是一系列数据库脚本的集合,findByOrderNoAndXxxx 方法可以由下面一节要提到的JpaSpecificationExecutor代替,而 updateOrderStatusById 方法则可以由 findOne + save 代替,不要觉得这变得复杂了,试想一下真正的业务场景,修改操作一般不会只涉及一个字段的修改, findOne + save 可以帮助你完成更加复杂业务操作,而不必关心我们该如何编写 SQL 语句,真正做到了面向领域开发,而不是面向数据库 SQL 开发,面向对象的拥趸者也必然会觉得,这更加的 OO。
Mybatis优势
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
MyBatis容易掌握,而Hibernate门槛较高。
Hibernate优势
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳
- hibernate是全自动,而mybatis是半自动
hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。
- hibernate数据库移植性远大于mybatis
hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、mysql等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。
- hibernate拥有完整的日志系统,mybatis则欠缺一些
hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。
- mybatis相比hibernate需要关心很多细节
hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。但也正因为mybatis使用简单,才导致它要比hibernate关心很多技术细节。mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因此很容易上手并开发项目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发出软件却很快。hibernate则正好与之相反。但是如果使用hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。
- sql直接优化上,mybatis要比hibernate方便很多
由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上hibernate不及mybatis。
MyBatis与JPA的区别是什么相关推荐
- Hibernate与JPA的区别是什么
翻译来源:https://www.quora.com/What-is-the-difference-between-Hibernate-and-JPA 本文作者:苏生米沿 本文地址:http://bl ...
- spring boot 整合mybatis和jpa遇到的那些坑,附代码
这两天自己练习搭建项目,其中需要用到springSecurity,JWT搞到一半发现数据库还没有配置,然后总结了下,决定用mybatis和jpa,进入正题 一.第一步,引入我们需要的jar包,这里我直 ...
- Mybatis与JPA冲突报BindingException: Invalid bound statement (not found)
在同时使用Mybatis和JPA时,项目运行过程中会报如下问题: InternalAuthenticationServiceException: org.apache.ibatis.binding.B ...
- MyBatis和JPA的优劣以及MyBatis-Plus的使用
一.MyBatis和JPA的优劣 JPA的优势: 简单的CRUD完全不需要写SQL语句,也不必编写持久层接口,仅仅需要继承JpaRepository接口即可.JPA提供了一种完全面相对象的编程方式,除 ...
- Jpa第一话 -- Springboot集成Jpa和Mybatis以及Jpa的最全使用
本文主要记录spring-boot-starter-data-jpa的详细使用. 在做一些小型无并发的项目时,说实话第一个想到的就是Jpa,一个Entity走天下. 1.Spring Jpa的使用 基 ...
- JDO和JPA的区别是什么
JDO(Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API.JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额 ...
- mybatis中 #{}和${}的区别是什么?
1) #{}是预编译处理, ${}是字符串替换. 2) Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值: 3) M ...
- 为啥国人偏爱 Mybatis,而老外喜欢 Hibernate/JPA 呢?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"1024"获取公众号专属1024GB资料 关于 SQL 和 ORM 的争论,永远都不会 ...
- 【转】JPA、Hibernate和Mybatis区别和总结
很多人都用过java的数据库连接池C3P0,但官方没有说明名称的由来. 据传闻:连接池作者是<星球大战>迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool ...
- 为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题.昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文. 声明:本文不会下关于Mybatis和JPA两个持久层框架哪 ...
最新文章
- 红帽计划收购API管理领导者3scale
- jquery如何判断div是否隐藏
- 【 FPGA 】序列检测器的Moore状态机实现
- linux 下的gettimeofday 函数在windows上的替换方案
- 信息学奥赛C++语言: 直角三角形
- 你修改了样式,却要我手动清除游览器缓存,这是BUG!
- ibatis_HelloWorld
- python 2.7.9 安装beautifulsoup4
- 数据分析没有思路怎么办
- php 的sentmail支持ssl吗_php 的swoole 和websocket 连接wss
- 浅谈 JNIEnv 和 JavaVM
- ma5200f设置使用用户名、密码登陆
- 微信支付商家转账到零钱功能使用教程
- 移动硬盘插入提示需要格式化RAW_内存卡无法格式化解决办法
- ICCV 2021 口罩人物身份鉴别全球挑战赛冠军方案分享
- 为什么我要选择使用 Yarn 来做 Docker 的调度引擎
- 【无标题】如何在C#中使用Dapper ORM学习通http://www.bdgxy.com/
- 二分算法实例应用(二)
- zsh介绍:2: CentOS下使用zsh
- ubuntu 20.4下服务器部署