第1章 MyBatis快速入门
1.ORM简介
1.JDBC
JDBC Java 与数据库交互的统一API,实际上它分为两组 API :
- 面向 Java 应用程序开发人员的 API :标准的 JavaAPI,独立于各个厂家的数据库实现。
- 面向数据库驱动程序开发人员的 API :用来给数据库驱动程序开发人员用于编写数据库驱动,是前者的底层支持
2.用JDBC操作DB
用JDBC操作数据,一般步骤如下:
- 注册驱动:注册数据库驱动 ,明确指定数据库 URL 地址、数据库用户名、密码等连接信息。
- 打开连接:通过 DriverManager 打开数据库连接。
- 创建Statement:通过数据库连接创建 Statement 对象。
- 获取ResultSet:通过 Statement 对象执行 SQL 语句,得到 ResultSet 对象。
- 解析ResultSet:通过 ResultSet 读取数据,并将数据转换成 JavaBean 对象。
- 关闭连接及资源:关闭 ResultSet Statement 对象以及数据库连接,释放相关资源。
上述1-4步,以及第6步,都是重复的。可以封装起来。
3.ORM
ORM ( Object Relational Mapping ,对象关系映射),就是用来封装上述重复步骤的。
ORM封装了上述重复操作,并且通过集成缓存、数据源、数据库连接池等组件来进行访问优化。
第三方缓存、第三方数据源等组件的接口,一般都是业界统一的,可以根据需要灵活替换。
如果不用ORM框架,那么你的DAO也会被重构成类似ORM的框架(dog
2.常见持久化框架
常见的框架有:
Hibernate:老牌的 ORM 框架, 替代了复杂 Java EE EJB 解决方案。可以实现对象模型与关系模型的映射,还可以屏蔽不同数据库产品 SQL 语句细微差异。
JPA(Java Persistence API) :EJB 3.0中持久化部分的规范,但它可以脱离 EJB 的体系单独使用。Gavin King 作为 Hibernate 创始人,同时也参与了 JPA 规范的编写,所以在 JPA 规范中可以看到很多与Hibernate 类似的概念和设计。JPA 仅仅是一个持久化的规范,它并没有提供具体的实现。其他持久化厂商会提供 JPA 规范的具体实现,例如, Hibernate。实践中少用。
Spring JDBC:仅仅是使用模板方式对原生 JDBC进行了一层非常薄的封装。直接执行原生 SQL 语句。Spring JDBC 中提供了 多种 Template 类,可以将对象中的属性映射成 SQL 语句中绑定的参数。
MyBatis:MyBatis 通过映射配置文件或相应注解将 ResultSet 映射为 Java 对象。相较于 Hibernate, MyBatis 更加轻量级。提供了动态SQL,执行原生的SQL也让我们有优化SQL的机会。也提供缓存机制。
3.MyBatis示例(略)
4.MyBatis 整体架构
MyBatis 的整体架构分为三层:
- 基础支持层
- 核心处理层
- 接口层
如下图所示:
1.基础支持层
基础支持层包含整个 MyBatis 的基础模块,用来支撑核心处理层。主要如下:
- 反射模块:对 Java 原生的反射进行了良好的封装和优化,提供了更加简洁易用的 API ,方便上层使调用。
- 类型转换模块:1.支持简化配置文件的别名机制。2.实现 JDBC 类型与 Java 类型之间的转换。该功能在为 SQL 语句绑定实参以及隐射查询结果集都会涉及。
- 日志模块:主要功能是集成第三方日志框架。
- 资源加载模块:对类加载器进行封装,确定类加载器的使用顺序。并提供了加载类文件以及其他资源文件的功能。
- 解析器模块:1.封装XPath,用来支持MyBatis初始时解析 mybatis-config.xml 配置文件以及映射配置文件。2.为处理动态 SQL 语句中的占位符提供支持。
- 数据源模块:MyBatis 自身提供了相应的数据源实现,也提供了与第三方数据源集成的接口。现在开源的数据源都提供了比较丰富的功能,例如,连接池功能、检测连接状态等。
- 事务管理:对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。一般使用时是集成Spring框架,用Spring来进行事务管理。
- 缓存模块:MyBatis 提供了一级缓存和二级缓存,底层由该模块支持。MyBatis提供的缓存和应用处于同一个JVM,量较大时,需要考虑其他缓存,如Redis。
- Binding 模块:在调用 SqI Session 相应方法执行数据库操作时,需要指定映射文件中定义的 SQL 节点。为了减少错误,MyBatis 通过 Binding 模块将用户自定义的 Mapper口与映射配置文件关联起来,这样就无需手动指定。开发人员无须编写自定义 Mapper 接口的实现, MyBatis 会自动为其创建动态代理对象。在有些场景中,自定义 Mapper 接口可以完全代替映射配置文件。
2.核心处理层
核心处理层实现了 MyBatis 的核心处理流程,包括 MyBatis 的初始化以及完成一次数据库操作涉及的全部流程。包含模块如下:
配置解析:主要是初始化解析配置文件:
- 加载
mybatis-config.xml
配置文件、映射配置文件以及Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到Configuration
对象中。例如:<resultMap>节点 -》ResultMap对象,<result>节点 -》ResultMapping对象。 - 利用该
configuration
对象创建 SqlSessionFactory 对象。 - MyBatis 初始化之后,可以通过初始化得到
SqlSessionFactory
创建SqlSession
对象并完成数据库操作。
- 加载
SOL 解析与 scripting 模块:主要是处理动态SQL。会根据用户传入的实参,解析映射文件中定义的动态 SQL节点,并形成数据库可执行的 SQL 语句 。之后会处理 SQL 语句中的占位符,绑定用户传入的实参。
SOL 执行:涉及多个组件 ,其中比较重要的是 Executor、StatementHandler、ParameterHandler、RsultSetHandler。
Executor
:维护一级缓存和二级缓存,并提供事务管理的相关操作。它会将数据库相关操作委托给 StatementHandler 完成。StatementHandler
:首先通过ParameterHandler
完成 SQL 语句的实参绑定,然后通过java.sql.Statement 象执行 SQL 语句并得到结果集,最后通过ResultSetHandler
完成结果集的映射,得到结果对象并返回 。整体示意图如下:
插件:可以通过添加用户自定义插件的方式对 MyBatis 进行扩展。用户自定义插件也可以改变 Mybatis 默认行为,例如,我们可以拦截 SQL 语句并对其
进行重写。编写插件前,对MyBatis核心原理要熟悉。
3.接口层
接口层相对简单,其核心是 SqlSession 接口。
SqlSession 接口中定义了 MyBatis 暴露给应用程序调用的API ,也就是上层应用与 MyBatis 交互的桥梁。
接口层在接收到 调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作。
小结
提问
什么是ORM?
MyBatis整体架构?
后续补充:Mapper接口的动态代理如何实现?如何绑定到<Mapper>节点。
第2章 基础支持层(略)
第3章 核心处理层(略)
第4章 高级主题(略)
转载请注明来源