整体架构

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对象之中。
它们的关系如下图所示:
