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本身提供的缓存机制不佳

  1. hibernate是全自动,而mybatis是半自动

hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。

  1. hibernate数据库移植性远大于mybatis

hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、mysql等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。

  1. hibernate拥有完整的日志系统,mybatis则欠缺一些

hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;而mybatis则除了基本记录功能外,功能薄弱很多。

  1. mybatis相比hibernate需要关心很多细节

hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。但也正因为mybatis使用简单,才导致它要比hibernate关心很多技术细节。mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因此很容易上手并开发项目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发出软件却很快。hibernate则正好与之相反。但是如果使用hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。

  1. sql直接优化上,mybatis要比hibernate方便很多

由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。总之写sql的灵活度上hibernate不及mybatis。

MyBatis与JPA的区别是什么相关推荐

  1. Hibernate与JPA的区别是什么

    翻译来源:https://www.quora.com/What-is-the-difference-between-Hibernate-and-JPA 本文作者:苏生米沿 本文地址:http://bl ...

  2. spring boot 整合mybatis和jpa遇到的那些坑,附代码

    这两天自己练习搭建项目,其中需要用到springSecurity,JWT搞到一半发现数据库还没有配置,然后总结了下,决定用mybatis和jpa,进入正题 一.第一步,引入我们需要的jar包,这里我直 ...

  3. Mybatis与JPA冲突报BindingException: Invalid bound statement (not found)

    在同时使用Mybatis和JPA时,项目运行过程中会报如下问题: InternalAuthenticationServiceException: org.apache.ibatis.binding.B ...

  4. MyBatis和JPA的优劣以及MyBatis-Plus的使用

    一.MyBatis和JPA的优劣 JPA的优势: 简单的CRUD完全不需要写SQL语句,也不必编写持久层接口,仅仅需要继承JpaRepository接口即可.JPA提供了一种完全面相对象的编程方式,除 ...

  5. Jpa第一话 -- Springboot集成Jpa和Mybatis以及Jpa的最全使用

    本文主要记录spring-boot-starter-data-jpa的详细使用. 在做一些小型无并发的项目时,说实话第一个想到的就是Jpa,一个Entity走天下. 1.Spring Jpa的使用 基 ...

  6. JDO和JPA的区别是什么

    JDO(Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API.JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额 ...

  7. mybatis中 #{}和${}的区别是什么?

    1) #{}是预编译处理, ${}是字符串替换. 2) Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值: 3) M ...

  8. 为啥国人偏爱 Mybatis,而老外喜欢 Hibernate/JPA 呢?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"1024"获取公众号专属1024GB资料 关于 SQL 和 ORM 的争论,永远都不会 ...

  9. 【转】JPA、Hibernate和Mybatis区别和总结

    很多人都用过java的数据库连接池C3P0,但官方没有说明名称的由来. 据传闻:连接池作者是<星球大战>迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool ...

  10. 为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?

    关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题.昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文. 声明:本文不会下关于Mybatis和JPA两个持久层框架哪 ...

最新文章

  1. 红帽计划收购API管理领导者3scale
  2. jquery如何判断div是否隐藏
  3. 【 FPGA 】序列检测器的Moore状态机实现
  4. linux 下的gettimeofday 函数在windows上的替换方案
  5. 信息学奥赛C++语言: 直角三角形
  6. 你修改了样式,却要我手动清除游览器缓存,这是BUG!
  7. ibatis_HelloWorld
  8. python 2.7.9 安装beautifulsoup4
  9. 数据分析没有思路怎么办
  10. php 的sentmail支持ssl吗_php 的swoole 和websocket 连接wss
  11. 浅谈 JNIEnv 和 JavaVM
  12. ma5200f设置使用用户名、密码登陆
  13. 微信支付商家转账到零钱功能使用教程
  14. 移动硬盘插入提示需要格式化RAW_内存卡无法格式化解决办法
  15. ICCV 2021 口罩人物身份鉴别全球挑战赛冠军方案分享
  16. 为什么我要选择使用 Yarn 来做 Docker 的调度引擎
  17. 【无标题】如何在C#中使用Dapper ORM学习通http://www.bdgxy.com/
  18. 二分算法实例应用(二)
  19. zsh介绍:2: CentOS下使用zsh
  20. ubuntu 20.4下服务器部署

热门文章

  1. 2021新版CISSP考试大纲解析
  2. Java线程之线程的五种状态
  3. FANUC机器人示教器介绍
  4. 关于一些常见的矢量格式图(SVG,EPS,wmf,emf)
  5. plc用c语言编程实例,化学反应生产过程的PLC控制编程实例
  6. 计算机视觉:步态识别-综述(一)
  7. 零基础自学软件测试-项目经验-电商项目实战-测试用例设计-促销中心
  8. 静态测试和动态测试相关知识点
  9. Unity中物体移动脚本
  10. cad如何多选对象_cad如何多选?在CAD里为什么只能选中一个对象,而不能累加选择多个对象?...