对应parsing包
解析器模块的主要提供了两个功能:一个功能是对XPath进行封装,为MyBatis初始化时解析mybatis- config.xml配置文 件以及映射配置文件提供支持;另一个功能是为处理动态SQL语句中的占位符提供支持。 3.1.6 数据源模块对应datasource包
数据源是实际开发中常用的组件之一。 现在开源的数据源都提供了比较丰富的功能,例如,连接池功能、检测连接状态等, 选择性能优秀的数据源组件对于提升ORM框架乃至整个应用的性能都是非常重要的。MyBatis 自身提供了相应的数据源实 现,当然MyBatis也提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中。 3.1.7 事务管理对应transaction包
MyBatis对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。在很多场景中,MyBatis 会与Spring 框架集成,并由Spring框架管理事务 3.1.8 缓存模块对应cache包
在优化系统性能时,优化数据库性能是非常重要的一个环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理地 使用缓存可以将一部分数据库请求拦截在缓存这一层。MyBatis 中提供了一 级缓存和二级缓存,而这两级缓存都是依赖于基 础支持层中的缓存模块实现的。这里需要读者注意的是,MyBatis中自带的这两级缓存与MyBatis 以及整个应用是运行在同 一个JVM中的,共享同一块堆内存。如果这两级缓存中的数据量较大,则可能影响系统中其他功能的运行,所以当需要缓存大 量数据时,优先考虑使用Redis、Memcache 等缓存产品。 3.1.9 Binding模块对应binding包
通过前面的示例我们知道,在调用SqlSession相应方法执行数据库操作时,需要指定映射文件中定义的SQL节点,如果出现 拼写错误,我们只能在运行时才能发现相应的异常。为了尽早发现这种错误,MyBatis 通过Binding模块将用户自定义的 Mapper接口与映射配置文件关联起来,系统可以通过调用自定义Mapper接口中的方法执行相应的SQL语句完成数据库操作, 从而避免上述问题。值得读者注意的是,开发人员无须编写自定义Mapper接口的实现,MyBatis 会自动为其创建动态代理对 象。在有些场景中,自定义Mapper接口可以完全代替映射配置文件,但有的映射规则和SQL语句的定义还是写在映射配置文件 中比较方便,例如动态SQL语句的定义。 3.1.10 注解模块对应annotation包
随着 Java 注解的慢慢流行,MyBatis 提供了注解的方式,使得我们方便的在 Mapper 接口上编写简单的数据库 SQL 操作代码,而无需像之前一样,必须编写 SQL 在 XML 格式的 Mapper 文件中。虽然说,实际场景下,大家还是喜欢在 XML 格式的 Mapper 文件中编写响应的 SQL 操作。
3.1.11 异常模块对应 exceptions 包
定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常,此外还包ExceptionFactory异常工厂。
3.2 核心处理层 3.2.1 配置解析对应executor包
在MyBatis初始化过程中,会加载mybatis config.xml配置文件、映射配置文件以及Mapper接口中的注解信息,解析后 的配置信息会形成相应的对象并保存到Configuration对象中。例如,示例中定义的<resultMap>节点(即ResultSet的映 射规则)会被解析成ResultMap对象;示例中定义的<result>节点(即属性映射)会被解析成ResultMapping对象。之后,利 用该Configuration对象创建SqlSessionFactory对象。待MyBatis 初始化之后,开发人员可以通过初始化得到 SqlSessionFactory 创建SqlSession对象并完成数据库操作。 3.2.2 SQL解析与Scripting模块对应executor scripting包
拼凑SQL语句是一件烦琐且易出错的过程,为了将开发人员从这项枯燥无趣的工作中解脱出来,MyBatis实现动态SQL语句的 功能,提供了多种动态SQL语句对应的节点,例如,<where>节点、 <if>节点、 <foreach> 节点等。通过这些节点的组合 使用,开发人员可以写出几乎满足所有需求的动态SQL语句。MyBatis中的scripting模块会根据用户传入的实参,解析映射 文件中定义的动态SQL节点,并形成数据库可执行的SQL语句。之后会处理SQL语句中的占位符,绑定用户传入的实参。 3.2.3 SQL执行