构建SqlSessionFactory过程

SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心接口SqlSession,所以

要先创建SqlSessionFactory,为此要提供配置文件和相关的参数。

MyBatis采用Builder模式去创建SqlSessionFactory,在实际中通过SqlSessionFactoryBuilder去构建,分两部:

  1. 通过 org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置的XML文件,读出所配置的参数,并将读取的
    内容存入org.apache.ibatis.session.Configuration类对象中。而Configuration采用的是单例模式,几乎所有的
    MyBatis配置内容都会存放在这个单例对象中,以便后续将这些内容读出。
  2. 使用Configuration对象去创建SqlSessionFactory。MyBatis中的SqlSessionFactory是一个接口,而不是实现类,
    为此MyBatis提供了一个默认的实现类org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。一般都不去创建新的实现类。

构建Configuration

它的作用:

读入配置文件,包括基础配置的XML和映射器XML(或注解)。

初始化一些基础配置,比如MyBatis的别名等,一些重要的类对象(比如插件、映射器、Object工厂、typeHandlers对象等)。

提供单例,为后续创建SessionFactory服务,提供配置的参数。

执行一些重要对象的初始化方法。

SqlSession运行过程

SqlSession也是一个接口,使用它并不复杂。它给出了查询、插入、更新、删除的方法。它的执行过程是通过Executor、StatementHandler、ParameterHandler和ResultSetHandler来完成对数据库操作和结果返回的。

  1. Executor代表执行器,由它调度StatementHandler、ParameterHandler、ResultSetHandler等来执行对应的SQL。其中StatementHandler是最重要的。
  2. StatementHandler的作用是使用数据库的Statement(PreparedStatement)执行操作,它是四大对象的核心,起到承上启下的作用,许多重要的插件都是通过拦截它来实现的。
  3. ParamentHandler是用来处理SQL参数的。
  4. ResultSetHandler是进行数据集的封装返回处理的,它相当复杂,好在我们不常用它。

执行过程:MyBatis根据Configuration来构建StatementHandler,然后使用prepareStatement方法,对SQL编译和参数初始化。

实现过程:它调用了StatementHandler的prepare()进行了预编译和基础的设置,然后通过StatementHandler的parameterize()来设置参数,最后使用StatementHandler的query方法,把ResultHandler传递进去,使用它的组织结果返回给调用者来完成一次查询。

Executor 执行器

SqlSession其实是一个门面,正真干活的是执行器,它是一个真正执行Java和数据库交互的对象,所以它十分的重要。

MyBatis中有3中执行器。我们可以在MyBatis的配置文件中进行选择。

(1)SIMPLE:简易执行器,它没有什么特别的,不配置它就使用默认执行器。

(2)REUSE:它是一种能够执行重用预处理语句的执行器。

(3)BATCH:执行器重用语句和批量更新,批量专用的执行器。

StatementHandler 数据库会话器

它是专门处理数据库会话的。

一条查询SQL的执行过程:

Executor先调用StatementHandler的prepare()方法预编译SQL,同时设置一些基本运行的参数。然后用paramerize()方法启用ParameterHandler设置参数,完成预编译,执行查询。MyBatis会使用ResultSetHandler封装结果返回给调用者。

ParamenterHanlder 参数处理器

MyBatis通过ParamenterHandler对预编译语句进行参数设置的,它的作用是完成对预处理编译参数的设置,它的作用是完成对预编译的设置,它的接口中有两个方法:

(1)Object getParamenterObject(); 作用:返回参数对象

(2)void setParameters(PreparedStatement ps) throws SQLException;

作用:设置预编译SQL语句的参数。同时它还有一个实现类:DefaultParamenterHandler,其中setParameters的方法中大体就是:

从parameterObject对象中取到参数,然后使用typeHandler转换参数,如果没设置,那么它会根据签名注册的typeHandler对象参数进行处理。而typeHandler也是MyBatis初始化时,注册在Configuration里面的,需要时就可以直接拿来用了,MyBatis是通过这样来完成参数配置的。

ResultSetHandler 结果集处理器

实现类DefaultResultSetHandler。

其接口中的两个方法:

List handleResultSets(Statement stmt) throws SQLException;

void handleOutputParameters(CallableStatement cs) throws SQLException;

handleOutputParameters:处理存储过程输出参数的。

handleResultSets:它是包装结果集的。

SqlSession总结:

由Executor调度StatementHandler来运行。

StatementHandler分散步:

(1)prepared预编译SQL。

(2)paramerize设置参数。

(3)query/update执行SQL。

paramerize是调用ParamenterHandler的方法设置的,而参数是根据类型处理器typeHandler处理的。

query/update方法通过ResultSetHandler进行处理结果的封装,如果是update语句,就返回整数,否则通过typeHandler处理结果类型,然后用ObjectFactory提供的规则组装对象,返回给调用者。