Mybatis原理理解章一(Mybatis架构设计)

一,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所有的配置信息。                

猜你喜欢

转载自my.oschina.net/u/3761887/blog/1647255