一,Mybatis框架整体设计
功能架构设计
Mybatis的功能架构分为三层:
1,API接口层: 提供给外部使用的接口API,通过调用这些本地API来操纵数据库。接口层接收到调用请求,开始调用数据处理层来完成具体的数据处理。
2,数据处理层:负责具体的SQL查找、SQL解析、SQL执行和结果映射处理等。根据调用的请求完成一次数据库操作。
3,基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,将共用的部分分离出来作为最基础的组件,为数据处理层提供最基础的支撑。
总体流程:
1,加载配置同时初始化。
执行过程:加载配置文件。配置文件来源两个地方,一个是配置文件,一个Java代码的注解,将SQl的配置信息加载成为一个MappedStatement对象,包括传入参数映射配置,执行的SQL语句,结果映射配置,存储在内存中。
2,接受调用请求。
执行过程:调用Mybatis的API,为SQL传入参数对象,将请求传递给处理层进行处理。
3,处理请求。
执行过程:API接口层传递请求和参数对象。
首先根据SQL的ID查找对应的MappedStatement对象。根据传递的参数对象,解析MappedStatement对象,得到要执行的SQL语句并传入参数。
然后获取数据库连接,将要执行的SQL和传入的参数到数据库中执行得到结果。
最后,根据MappedStatement对象的结果映射配置,将得到的执行结果进行转换处理,得到最终的处理结果,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回,并释放连接资源。
细枝分析:
1,接口层和数据库交互的方式。
Mybatis和数据库的交互有两种方式。
第一种:使用传统的Mybatis提供的API接口,传递传统的Statement ID和查询参数给SqlSession对象,使用SqlSession对象完成和数据库的交互,达到对数据的增删查改操作。Mybatis提供的API不仅可对数据库进行增删查改操作,也对数据库的连接信息,Mybatis的配置信息进行操作。
优点:简单实用。
缺点:不符合面向对象语言的概念和面向接口编程的编程习惯。面向接口的编程是面向对象的大趋势,MyBatis为了适应这一趋势,增加了第二种使用MyBatis 支持接口调用方式。
第二种:使用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("statetmentId",parameterObject);或者SqlSession.undate...、SqlSession.insert...来对数据库进行操作。(动态代理机制需细分,附链接跳转)。
优点:满足面向接口编程的需要。在接口上可以使用注解配置SQL语句,脱离XML配置文件,实现零配置。
2,数据处理层
数据处理层是Mybatis的核心,分为三个分支来讲:
2.1,通过传入参数动态构建SQL语句。
MyBatis 通过传入的参数值,使用 Ognl 来动态地构造SQL语句,得到要执行的SQL语句。参数映射指对于java 数据类型和jdbc数据类型之间的转换:这里有包括两个过程:查询阶段,将java类型的数据,转换成jdbc类型的数据,通过 preparedStatement.setXXX() 来设值;另一个就是对resultset查询结果集的jdbcType 数据转换成java 数据类型。(动态构建SQL需细分)
优点:使MyBatis 有很强的灵活性和扩展性。
2.2,SQL语句的执行。
然后获取数据库连接,将要执行的SQL和传入的参数到数据库中执行得到结果。
2.3,SQL语句执行结果处理
根据MappedStatement对象的结果映射配置,将得到的执行结果进行转换处理,支持结的果集关系一对多和多对一的转换,并且有两种支持方式,一种为嵌套查询语句的查询,还有一种是嵌套结果集的查询。可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回,并释放连接资源。
3,框架支撑层
3.1 SQL语句的配置方式
传统的配置SQL语句方式是使用XML进行,但这种方式不能很好的支持面向接口变成的趋势,面向接口的编程是面向对象编程的大趋势,为了支持面向接口的编程,Mybatis引入了Mapper接口的概念,达到使用注解来配置SQL语句。调用只需要在接口上添加必要的注解,不需要再配置XML。但某些高级功能还是需要依赖XML配置文件配置SQL语句。
3.2 事务管理机制
(事务管理机制需细分)
3.3连接池管理机制
(连接池管理机制需细分)
3.4缓存机制
(缓存机制需细分)
4 ,引导层
引导层是配置和启动MyBatis 配置信息的方式。
MyBatis 提供两种方式来引导MyBatis :基于XML配置文件的方式和基于Java API 的方式。
二,Mybatis的主要对象
Mybatis的主要核心对象分以下:
SqlSession:MyBatis工作的主要顶层API,和数据库交互的会话,完成数据库增删改查功能 (SqlSession工作过程细分,附链接跳转)。
StatementHandler:封装JDBC Statement操作,负责对JDBC statement 的操作,如将Statement结果集转换成List集合。
ParameterHandler :负责对用户传递的参数转换成JDBC Statement 所需要的参数。
Executor:MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护。
ResultSetHandler :将JDBC返回的ResultSet结果集对象转换成List类型的集合。
TypeHandler : 负责java数据类型和jdbc数据类型之间的映射和转换。
MappedStatement: 维护一条<select|update|delete|insert>节点的封装。
SqlSource: 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回该对象。
BoundSql :表示动态生成的SQL语句以及相应的参数信息。
Configuration : 维持 MyBatis所有的配置信息。
来源:oschina
链接:https://my.oschina.net/u/3761887/blog/1647255