Hibernate
:是一款Java
世界中最著名的ORM
框架之一JPA(Java Persistence API)
: 是EJB 3 .0
中持久化部分的规范,但它能够脱离EJB
的体系单Spring JDBC
:严格来讲,Sring JDBC
不能算是一个ORM
架,它仅仅是使用模板方式对原生DBC
行了一层很是薄的封装MyBatis
: MyBatis
前身是Apache
基金会的开源项目iBatis
,在2010 年该项目脱离Apache
基金会并正式改名为MyBatis
JDBC
编程中的查询操做为例进行说明,其主要步骤以下:
URL
地址、数据库用户名、密码等链接信息DriverManager
打开数据库链接Statement
对象Statement
对象执行 SQL
语句,获得 ResultSet
对象ResultSet
读取数据,并将数据转换成 JavaBean
对象ResultSet
、 Statement
对象以及数据库链接,释放相关资源java操做数据库
java
MyBatis
,其主要步骤以下:
mybatis-config.xml
配置文件, 配置数据库的URL
地址、数据库用户名和密码、别名信息、映射配置文件的位置以及一些全局配置信息mybatis-config.xml
配置文件SqlSessionFactory
对象SqlSessionFactory
对象建立 SqlSession
对象, SqlSession
接口中定义了执行SQL语句所须要的各类方法SqlSession
对象执行映射配置文件中定义的 SQL
语句,完成相应的数据操做SqlSession
对象提交事务,关闭 SqlSession
对象
- 总体结构图
- 一条sql大体的执行过程
反射模块sql
Java
中的反射虽然功能强大,可是代码编写起来比较复杂且容易出错,为了简化反射操做的相关代码,MyBatis
提供了专门的反射模块,该模块位于 org.apache.ibatis.reflection
包中,它对常见的反射操做作了进一步封装,提供了更加简洁方便的反射API
类型转换模块数据库
SQL
语句绑定实参时, 会将数据由 Java
类型转换成 JDBC
类型;而在映射结果集时,会将数据由 JDBC
类型转换成 Java 类型日志模块:apache
资源加载模块编程
解析器模块缓存
XPath
进行封装,为 MyBatis
初始化时解析 mybatis-config.xml
配置文件以及映射配置文件提供支持SQL
语句中的占位符提供支持数据源模块:提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中mybatis
事务管理:对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现,与 Spring
框架集成,并由 Spring
框架管理事务架构
缓存模块app
- 简单的缓存使用图
注意:MyBatis
中自带的这两级缓存与MyBatis
以及整个应用是运行在同一个JVM
中的,共享同一块堆内存。若是这两级缓存中的数据量较大, 则可能影响系统中其余功能的运行,因此当须要缓存大量数据时 ,优先考虑使用Redis
、Memcache
等缓存产品
Binding
模块:MyBatis
经过 Binding
模块将用户自定义的 Mapper
接口与映射配置文件关联起来,系统能够经过调用自定义 Mapper
接口中的方法执行相应的 SQL
语句完成数据库操做,开发人员无须编写自定义 Mapper
接口的实现, MyBatis
会自动为其建立动态代理对象框架
MyBatis
初始化过程当中,会加载 mybatis-config.xml
配置文件、映射配置文件以及Mapper
接口中的注解信息,解析后的配置信息会造成相应的对象并保存到 Configuration
对象中SOL
解析与 scripting
模块
MyBatis
实现动态 SQL
语句的功能,提供了多种动态 SQL
语句对应的节点scripting
模块会根据用户传入的实参,解析映射文件中定义的动态 SQL
节点,并造成数据库可执行的 SQL
语句 。以后会处理 SQL
语句中的占位符,绑定用户传入的实参SOL
执行:语句的执行涉及多个组件 ,其中比较重要的是Executor
、StatementHandler
、ParameterHandler
和 ResulSetHandler
,步骤以下:
Executor
主要负责维护一级缓存和二级缓存,并提供事务管理的相关操做 ,它会将数据库相关操做委托给 StatementHandler
完成StatementHandler
首先经过 ParameterHandler
完成 SQL
语句的实参绑定,而后经过java.sql.Statement
对象执行 SQL
语句并获得结果集ResultSetHandler
完成结果集的映射,获得结果对象并返回MyBatis
进行扩展,用户自定义插件也能够改变 Mybatis
的默认行为SqlSession
接口,该接口中定义了 MyBatis
暴露给应用程序调用的 API
,也就是上层应用与 MyBatis
交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操做