整体架构
MyBatis和数据库交互有两种方式:
- 使用传统的MyBatis提供的API:传递Statement Id和查询参数给
SqlSession
对象,使用SqlSession
对象完成和数据库的交互: - 使用Mapper接口:MyBatis将配置文件中的每一个
<mapper>
节点抽象为一个Mapper
接口,而这个接口中声明的方法和<mapper>
节点中的<select | update | delete | insert>
节点项对应,即select | update | delete | insert
节点的id值为Mapper
接口中的方法名称,parameterType
值表示Mapper
对应方法的入参类型,而resultMap
值则对应了Mapper
接口表示的返回值类型:
使用Mapper
接口的方式并配置好相关信息后,通过SqlSession.getMapper(XXXMapper.class)
方法,MyBatis会根据相应的接口声明的方法信息,通过动态代理机制生成一个Mapper
实例,我们使用Mapper
接口的某一个方法时,MyBatis会根据这个方法的方法名,确定Statement Id
,底层还是通过SqlSession.select("statementId",parameterObject);
或者SqlSession.update("statementId",parameterObject);
等等来实现对数据库的操作。
主要构件
从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个:
SqlSession
:作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能Executor
:MyBatis执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓存的维护StatementHandler
:封装了JDBC Statement操作,负责对JDBC Statement的操作,如设置参数、将Statement结果集转换成List
集合ParameterHandler
:负责对用户传递的参数转换成JDBC Statement所需要的参数ResultSetHandler
:负责将JDBC返回的ResultSet
结果集对象转换成List
类型的集合TypeHandler
:负责java数据类型和jdbc数据类型之间的映射和转换MappedStatement
:MappedStatement
维护了一条<select | update | delete | insert>
节点的封装SqlSource
:负责根据用户传递的parameterObject
,动态地生成SQL语句,将信息封装到BoundSql
对象中,并返回BoundSql
:表示动态生成的SQL语句以及相应的参数信息Configuration
:MyBatis所有的配置信息都维持在Configuration
对象之中。
它们的关系如下图所示: