1、功能架构设计java
功能架构讲解:sql
咱们把Mybatis的功能架构分为三层:数据库
(1) API接口层:提供给外部使用的接口API,开发人员经过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。编程
MyBatis和数据库的交互有两种方式:api
a.使用传统的MyBatis提供的API;缓存
b. 使用Mapper接口mybatis
a1.使用传统的MyBatis提供的API架构
这是传统的传递Statement Id 和查询参数给 SqlSession 对象,使用 SqlSession对象完成和数据库的交互;MyBatis 提供了很是方便和简单的API,供用户实现对数据库的增删改查数据操做,以及对数据库链接信息和MyBatis 自身配置信息的维护操做。app
上述使用MyBatis 的方法,是建立一个和数据库打交道的SqlSession对象,而后根据Statement Id 和参数来操做数据库,这种方式当然很简单和实用,可是它不符合面向对象语言的概念和面向接口编程的编程习惯。因为面向接口的编程是面向对象的大趋势,MyBatis 为了适应这一趋势,增长了第二种使用MyBatis 支持接口(Interface)调用方式。框架
1.2. 使用Mapper接口
MyBatis 将配置文件中的每个<mapper> 节点抽象为一个 Mapper 接口,而这个接口中声明的方法和跟<mapper> 节点中的<select|update|delete|insert> 节点项对应,即<select|update|delete|insert> 节点的id值为Mapper 接口中的方法名称,parameterType 值表示Mapper 对应方法的入参类型,而resultMap 值则对应了Mapper 接口表示的返回值类型或者返回结果集的元素类型。
根据MyBatis 的配置规范配置好后,经过SqlSession.getMapper(XXXMapper.class) 方法,MyBatis 会根据相应的接口声明的方法信息,经过动态代理机制生成一个Mapper 实例,咱们使用Mapper 接口的某一个方法时,MyBatis 会根据这个方法的方法名和参数类型,肯定Statement Id,底层仍是经过SqlSession.select("statementId",parameterObject);或者SqlSession.update("statementId",parameterObject); 等等来实现对数据库的操做
MyBatis 引用Mapper 接口这种调用方式,纯粹是为了知足面向接口编程的须要。(其实还有一个缘由是在于,面向接口的编程,使得用户在接口上可使用注解来配置SQL语句,这样就能够脱离XML配置文件,实现“0配置”)。
(2) 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操做。
(2.1).参数映射和动态SQL语句生成
动态语句生成能够说是MyBatis框架很是优雅的一个设计,MyBatis 经过传入的参数值,使用 Ognl 来动态地构造SQL语句,使得MyBatis有很强的灵活性和扩展性。
参数映射指的是对于java 数据类型和jdbc数据类型之间的转换:这里有包括两个过程:查询阶段,咱们要将java类型的数据,转换成jdbc类型的数据,经过 preparedStatement.setXXX() 来设值;另外一个就是对resultset查询结果集的jdbcType 数据转换成java 数据类型。
(2.2). SQL语句的执行以及封装查询结果集成List<E>
动态SQL语句生成以后,MyBatis 将执行SQL语句,并将可能返回的结果集转换成List<E> 列表。MyBatis 在对结果集的处理中,支持结果集关系一对多和多对一的转换,而且有两种支持方式,一种为嵌套查询语句的查询,还有一种是嵌套结果集的查询。
(3)基础支撑层:负责最基础的功能支撑,包括链接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来做为最基础的组件。为上层的数据处理层提供最基础的支撑。
2、mybatis执行流程
1. 加载配置文件并初始化(SqlSession)
配置文件来源于两个地方,一个是配置文件(主配置文件conf.xml,mapper文件*.xml),一个是java代码中的注释,将sql的配置信息加载成为一个mappedstatement对象,存储在内存之中(包括传入参数的映射配置,结果映射配置,执行的sql语句)。
2. 接收调用请求
调用mybatis提供的api,传入的参数为sql的id(有namespase和具体sql的id组成)和sql语句的参数对象,mybatis将调用请求交给请求处理层。
3. 处理请求
根据sql的id找到对应的mappedstatament对象。
根据传入参数解析mappedstatement对象,获得最终要执行的sql。
获取数据库链接,执行sql,获得执行结果
Mappedstatement对象中的结果映射对执行结果进行转换处理,并获得最终的处理结果。
释放链接资源
4. 返回处理结果