MyBatis 运行原理

构建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提供的规则组装对象,返回给调用者。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值