JPA 

全称Java Persistence API,为POJO提供持久化标准规范,可以通过注解或者XML描述【对象-关系】之间的映射关系,并将实体对象持久化到数据库中。

JPA是一套ORM规范,Hibernate实现了JPA规范!

Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。

JDBC和JPA的区别

  • 不同标准:jdbc是数据库的统一接口标准;jpa是orm框架的统一接口标准。
  • 用法区别:jdbc更注重数据库,orm则更注重于java代码,但是实际上jpa实现的框架底层还是用jdbc去和数据库打交道。

JTA

Java事务API(JTA:Java Transaction API)和它的同胞Java事务服务(JTS:Java Transaction Service),为J2EE平台提供了分布式事务服务(distributed transaction)。

JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。

Spring ErrorCode定义

通过SQLErrorCodeSQLExceptionTranslator解析错误码

org/springframework/jdbc/support/sql-error-codes.xml

自己定义错误覆盖:Classpath下的sql-error-codes.xml

Mybatis

简介

Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵活度高。

作为一个半ORM框架,MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。

由于MyBatis专注于SQL本身,灵活度高,所以比较适合对性能的要求很高,或者需求变化较多的项目

Mybaits优缺点

  • 优点

    • 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用
    • 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接
    • 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)
    • 能够与Spring很好的集成
    • 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护
  • 缺点
    • SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
    • SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

Mybatis缓存

一级缓存(默认开启)

Mybatis的一级缓存原理(sqlsession级别)。第一次发出一个查询 sql,sql 查询结果写入 sqlsession 的一级缓存中,缓存使用的数据结构是一个 map。

  • key:MapperID+offset+limit+Sql+所有的入参
  • value:用户信息

同一个 sqlsession 再次发出相同的 sql,就从缓存中取出数据。如果两次中间出现 commit 操作(修改、添加、删除),本 sqlsession 中的一级缓存区域全部清空,下次再去缓存中查询不到所以要从数据库查询,从数据库查询到再写入缓存。

二级缓存(默认关闭)

二级缓存的范围是 mapper 级别(mapper 同一个命名空间),mapper 以命名空间为单位创建缓存数据结构,结构是 map。mybatis 的二级缓存是通过 CacheExecutor 实现的。CacheExecutor其实是 Executor 的代理对象。所有的查询操作,在 CacheExecutor 中都会先匹配缓存中是否存在,不存在则查询数据库。

  • key:MapperID+offset+limit+Sql+所有的入参

主要组件和执行流程

Hibernate

一、两者最大的区别

  • 针对简单逻辑,Hibernate与MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法。
  • 针对高级查询,MyBatis需要手动编写SQL语句,以及ResultMap,而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于流程。

二、开发难度对比

  • Hibernate的开发难度大于MyBatis,主要由于Hibernate比较复杂,庞大,学习周期比较长。
  • MyBatis则相对简单,并且MyBatis主要依赖于原生sql书写,让开发者更熟悉。

三、sql书写比较

  • Hibernate也可以自己写sql指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性,不过Hibernate有自己的日志统计。
  • MyBatis的sql是手动编写的,所以可以按照要求指定查询的字段,不过没有自己的日志统计,所以要借助Log4j来记录日志。

四、数据库扩展性计较

  • Hibernate与数据库具体的关联在XML中,所以HQL对具体是用什么数据库并不是很关心
  • MyBatis由于所有sql都是依赖数据库书写的,所以扩展性、迁移性比较差。

理解JDBC/JPA/Mybatis/Hibernate相关推荐

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

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

  2. jdbc,mybatis,hibernate各自优缺点及区别

    jdbc,mybatis,hibernate各自优缺点及区别 先比较下jdbc编程和hibernate编程各自的优缺点. JDBC: 我们平时使用jdbc进行编程,大致需要下面几个步骤:1,使用jdb ...

  3. hibernate jpa_JPAHibernate替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?...

    hibernate jpa 你好!你好吗? 今天我们将讨论不建议使用JPA / Hibernate的情况. 在JPA领域之外,我们还有哪些选择? 我们将谈论的是: JPA /Hibernate问题 解 ...

  4. JPA休眠替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?

    你好!你好吗? 今天,我们将讨论不建议使用JPA / Hibernate的情况. 在JPA领域之外,我们还有哪些选择? 我们将谈论的是: JPA /休眠问题 解决一些JPA /休眠问题的方法 选择此处 ...

  5. 理解什么是MyBatis?

    2019独角兽企业重金招聘Python工程师标准>>> 理解什么是MyBatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache s ...

  6. springboot+jpa+mybatis 多数据源支持

    springboot+jpa+mybatis 多数据源支持 配置dataSource import org.springframework.beans.factory.annotation.Quali ...

  7. SpringData Jpa、Hibernate、Jpa 三者之间的关系

    JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架--因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...

  8. gwt-2.8.2下载_GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示

    gwt-2.8.2下载 不久前,我的一个朋友和同事向我飞过,说"世界上只有一半在使用Maven ". 当我意识到最受欢迎的文章(到目前为止) GWT 2 Spring 3 JPA ...

  9. GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示

    不久前,我的一个朋友和同事向我飞过,说"世界上只有一半在使用Maven ". 当我意识到最受欢迎的文章(到目前为止) GWT 2 Spring 3 JPA 2 Hibernate ...

  10. JPA与Hibernate的关系

    1.JPA JPA全称: Java Persistence API   JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.   JPA的出现?    ...

最新文章

  1. mysql数据库备份方案_MySQL平台数据库备份方案详细说明
  2. 教程 | 基于LSTM实现手写数字识别
  3. 构建虚拟工控环境系列 - 西门子虚拟PLC
  4. 领克linux系统怎么下载软件,新升级的领克车机系统好用吗?我们来盘一下
  5. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
  6. c语言队列(顺序队列,循环队列,链式队列)
  7. 人生苦短我用python梗_人生苦短我用python: eval,e
  8. cacheAsBitmap = ‘true' 可以降低cpu,提高效率?
  9. python3调用c语言数组,使用Python中的ctypes访问数组
  10. windows系统nexus3安装和配置
  11. “饮水机”:形象比喻 深入浅出理解RAID
  12. ios获取新数据要不要关_iPhone用户注意!不要再滑动关后台,否则……
  13. 不在更改国内网络账号的ID了
  14. scope=“prototype”和scope=“session”
  15. G1垃圾回收器总结一
  16. 气象报告是什么计算机领域,计算机辅助翻译系统在亚运气象服务方面地应用报告.pdf...
  17. 蒙特卡洛模拟方法的matlab实现
  18. Python基础语法回顾
  19. 创建对象的几种常用写法
  20. mysql indentify_Database 中 identify relationship 和 non-identify relationship的区别

热门文章

  1. 正则表达式实现与或非
  2. 设置一绝对地址为0x67a9的整型变量的值为0xaa66
  3. 普适计算-2014/02/28
  4. C# 地理信息系统GIS开源软件
  5. 低维空间到高维空间的映射
  6. java栈溢出_java 内存溢出 栈溢出的原因与排查方法
  7. Mars3D开发基础学习:三维场景 Map
  8. 自然人机交互到底“自然”在哪儿?
  9. 01炼数成金TensorFlow基本概念
  10. 日期插件(默认显示当前日期)---年月