环境准备与学习目标
MyBatis是一个流行的Java持久层框架,通过XML配置简化JDBC操作,学习其源码有助于理解设计模式和扩展性,本系列将深入解析MyBatis 3.x的核心组件、执行流程及扩展机制。
容器的加载与初始化
config文件解析
MyBatis通过XMLConfigBuilder.parseConfiguration
方法解析配置文件,包括属性、设置、VFS、类型别名、插件等。
Mapper加载与初始化
XMLMapperBuilder
负责解析Mapper文件,处理SQL语句和结果映射,核心是MyBatis语言驱动器,用于解析动态SQL。
关键对象归纳与回顾
SqlSource:表示SQL语句的抽象。
SqlNode:不同类型的SQL节点,如ChooseSqlNode
、ForEachSqlNode
等。
BaseBuilder:构建器基类。
TypeHandler:处理Java类型与数据库类型间的映射。
ObjectWrapperFactory:创建对象的包装器。
MetaObject:提供对对象属性的访问和修改。
ObjectFactory:创建对象实例。
LanguageDriver:驱动MyBatis语言元素。
ResultMap:定义结果集与Java对象的映射关系。
ResultMapping:具体的映射配置。
Discriminator:用于结果集中不同记录的分发。
SQL语句的执行流程
传统JDBC用法
传统的JDBC操作包括加载驱动、获取连接、创建Statement、参数填充、执行查询等步骤。
MyBatis执行SQL语句
MyBatis执行SQL语句涉及多个组件,包括执行器、SqlSession、Sql语句构建器等,执行方式有两种:直接执行和通过Mapper接口执行。
动态SQL
MyBatis支持动态SQL,可以根据条件生成不同的SQL语句。
存储过程与函数调用
MyBatis可以调用存储过程和数据库函数。
事务实现
MyBatis支持事务管理,确保数据一致性。
缓存
MyBatis提供了一级和二级缓存机制,提高查询性能。
执行期主要类归纳
Executor:负责SQL语句的执行。
ParameterHandler:处理输入参数。
StatementHandler:处理JDBC Statement的创建和执行。
ResultSetHandler:处理查询结果集。
插件
MyBatis支持插件机制,可以扩展其功能,如分页插件PageHelper和监控插件StatHelper。
与Spring集成
MyBatis可以与Spring框架无缝集成,提供声明式事务管理和依赖注入支持。
FAQs
1、问题:MyBatis中如何实现懒加载?
解答:MyBatis本身不提供懒加载功能,但可以通过集成第三方库如Ognl或通过编程方式实现,通常在查询时不立即加载关联对象,而是在需要时再进行加载。
2、问题:MyBatis的$和#符号有什么区别?
解答:在MyBatis中,$符号用于在SQL语句中插入一个值,而#符号用于预编译语句中的占位符。$符号可能导致SQL注入风险,而#符号则不会。