如上所示,这是一个简单的Mybaits执行流程.

我们其实可以看到,一直到第三步(Sqlsession)那么一步,这都是我们的程序里需要创建的.而之后的步骤才是底层完成的任务.

  • 这里就有了一个引申的概念,四大对象。

    1 executor 调用StatementHandler,以此来执行SQL语句。

    这个是结构图.

    BaseExecutor:这个执行器执行了最基本的功能,其实如果你用debug就能发现。其余几个执行器执行时,也会调用这个 BaseExecutor中的方法。

    SimpleExecutor:最简单的执行器,根据对应的sql直接执行即可,不会做一些额外的操作;拼接完SQL之后,直接交给 StatementHandler 去执行。

    BatchExecutor:通过批量操作来优化性能。通常需要注意的是批量更新操作,由于内部有缓存的实现,使用完成后记得调用flushStatements来清除缓存。

    ReuseExecutor :可重用的执行器,重用的对象是Statement,也就是说该执行器会缓存同一个sql的Statement,省去Statement的重新创建,优化性能。

      内部的实现是通过一个HashMap来维护Statement对象的。由于当前Map只在该session中有效,所以使用完成后记得调用flushStatements来清除Map。

    CachingExecutor:启用于二级缓存时的执行器;

      采用静态代理;代理一个 Executor 对象。

      执行 update 方法前判断是否清空二级缓存;

      执行 query 方法前先在二级缓存中查询,命中失败再通过被代理类查询。

    它使用StaementHandler实现JDBC的操作的。

    2 parameterHandler:

    这个主要是对参数进行操作。

    public void setParameters(PreparedStatement ps) throws SQLException {
    ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
    //获取一个SQL语句集合的参数列表
    List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
    //如果参数列表不为空
    if (parameterMappings != null)
    {
    //循环整个参数列表
    for (int i = 0; i < parameterMappings.size(); i++) {
    //取出每一个参数
    ParameterMapping parameterMapping = parameterMappings.get(i);
    //??????
    if (parameterMapping.getMode() != ParameterMode.OUT) {
    //
    Object value;
    //`获取javaBean中的属性名称(如果你用javaBean作为参数输入到SQL语句中,SQL不也是会为你分配到相应的sql中嘛。
    //这个就是)
    String propertyName = parameterMapping.getProperty();
    //查询是否有特殊加入的参数
    if (boundSql.hasAdditionalParameter(propertyName)) { // issue #448 ask first for additional params
    value = boundSql.getAdditionalParameter(propertyName);
    } else if (parameterObject == null) {
    value = null;
    } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
    value = parameterObject;
    } else {
    MetaObject metaObject = configuration.newMetaObject(parameterObject);
    value = metaObject.getValue(propertyName);
    }
    //获得typeHandler。这是一种可以用来对输入的值进行处理的函数,将java数据类型转化为数据库数据类型。
    //你既可以自己定义,Mybatis也为你提供了一些基本的。
    TypeHandler typeHandler = parameterMapping.getTypeHandler();
    //jdbcType是对应的sql参数(这个是你在XML文件中设置的,用来对应javaType和jdbcType)JDBCtYPE是一个枚举类型
    // <result property="FLD_NUMBER" column="FLD_NUMBER" javaType="double" jdbcType="NUMERIC"/>
    JdbcType jdbcType = parameterMapping.getJdbcType();
    //如果两者都为空
    if (value == null && jdbcType == null) jdbcType = configuration.getJdbcTypeForNull();
    //
    typeHandler.setParameter(ps, i + 1, value, jdbcType);
    }
    }
    }
    }
    //设置参数
    public void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
    如果参数列表为空
    if (parameter == null) {
    对应的jdbcType为空
    if (jdbcType == null) {
    可以为空的参数必须设置jdbcType,否则就报错。
    throw new TypeException("JDBC requires that the JdbcType must be specified for all nullable parameters.");
    }
    try {
    ps.setNull(i, jdbcType.TYPE_CODE);
    } catch (SQLException e) {
    throw new TypeException("Error setting null for parameter #" + i + " with JdbcType " + jdbcType + " . " +
    "Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. " +
    "Cause: " + e, e);
    }
    } else {
    //根据传入参数的不同,调用不同种类的set函数,让其进行替换。
    setNonNullParameter(ps, i, parameter, jdbcType);
    }
    }

    3 ResultSetHandler

    对结果进行操作,将SQL的查询加入到java类型之中。

    public interface ResultSetHandler {
    // 将Statement执行后产生的结果集(可能有多个结果集)映射为结果列表
    <E> List<E> handleResultSets(Statement stmt) throws SQLException; <E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;
    // 处理存储过程执行后的输出参数
    void handleOutputParameters(CallableStatement cs) throws SQLException; }

    3. DefaultResultSetHandler

      ResultSetHandler的具体实现类是DefaultResultSetHandler,其实现的步骤就是将Statement执行后的结果集,按照Mapper文件中配置的ResultType或ResultMap来封装成对应的对象,最后将封装的对象返回 。

      以最常用的 handleResultSets 为例进行简单的分析:

    public List<Object> handleResultSets(Statement stmt) throws SQLException {
    ErrorContext.instance().activity("handling results").object(mappedStatement.getId()); final List<Object> multipleResults = new ArrayList<Object>(); int resultSetCount = 0;
    // 第一个结果集
    ResultSetWrapper rsw = getFirstResultSet(stmt);
    // 获取 resultMap
    List<ResultMap> resultMaps = mappedStatement.getResultMaps();
    int resultMapCount = resultMaps.size();
    // 判断 ResultMap 是否为空,空则抛异常
    validateResultMapsCount(rsw, resultMapCount);
    // 处理第一个结果集
    while (rsw != null && resultMapCount > resultSetCount) {
    ResultMap resultMap = resultMaps.get(resultSetCount);
    // 将结果集映射为对应的 ResultMap 对象
    handleResultSet(rsw, resultMap, multipleResults, null);
    rsw = getNextResultSet(stmt);
    cleanUpAfterHandlingResultSet();
    resultSetCount++;
    } String[] resultSets = mappedStatement.getResultSets();
    if (resultSets != null) {
    // 多个结果集
    while (rsw != null && resultSetCount < resultSets.length) {
    ResultMapping parentMapping = nextResultMaps.get(resultSets[resultSetCount]);
    if (parentMapping != null) {
    String nestedResultMapId = parentMapping.getNestedResultMapId();
    ResultMap resultMap = configuration.getResultMap(nestedResultMapId);
    handleResultSet(rsw, resultMap, null, parentMapping);
    }
    rsw = getNextResultSet(stmt);
    cleanUpAfterHandlingResultSet();
    resultSetCount++;
    }
    } return collapseSingleResultList(multipleResults);
    }

    4 StatementHandler:

    这个参数操作了SQL语句的整个执行流程。

这个我以前有文章进行过讲解,所以这个就先算了。就不讲了。


既然对于四大接口(四大对象)有了基本的了解。那么我们就看看下面的图片。我想应该不算很难吧。

参数映射部分算是对应:parameterHandler:

XML配置加载部分可以看看如下这张图片:

参数映射部分在这篇文章中

之后是SQL语句执行:

这个步骤在我看来是对应StatementHandler

结果映射则是由ResultSetHandler完成的.

(当然,这个就是理解一下四大对象在Mybatis中发生什么作用)


各种常用的Mybatis主要作用。

  • BoundSql类,封装mybatis最终产生sql的类,包括sql语句,参数,参数源数据等参数:
  • Configuration类:就像是MyBatis的总管,里面包含了所有的信息。无论是连接

Mybatis架构相关的知识的更多相关文章

  1. JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识

    JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...

  2. 【RAC】RAC相关基础知识

    [RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁. ...

  3. Linux实战教学笔记19:Linux相关网络知识梳理

    第十九节 Linux相关网络知识梳理 标签(空格分隔): Linux实战教学笔记-陈思齐 一,前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工 ...

  4. day 28 网络基础相关的知识

    1.网络基础相关的知识 架构 C/S 架构:  client 客户端  server服务器端 优势: 能充分发挥PC机的性能 B/S 架构: browser 浏览器 server服务器       隶 ...

  5. JAVA相关基础知识

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...

  6. Mybatis架构原理(二)-二级缓存源码剖析

    Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...

  7. .NET同步与异步之相关背景知识(六)

    在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...

  8. Mybatis架构学习

    Mybatis架构学习 MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架.MyBatis 封装了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.可以对配置和原生Map使用 ...

  9. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中web相关的知识(概述)

    Spring Framework中web相关的知识 1.概述: 参考资料:官网documentation中第22小节内容 关于spring web mvc:  spring framework中拥有自 ...

随机推荐

  1. CSDN账号被冻结了怎么办

    CSDN可能因为你的博客里有一些网站链接给你判断为恶意推广广告,冻结, 或者和我一样,在评论区刷屏被冻结, 联系客服即可,向客服提供你的绑定邮箱或绑定手机号,或博客id,客服会给你解冻 PS: 找不到 ...

  2. 第七届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.煤球数量 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第 ...

  3. java实现数组转置

    ** 数组转置** 编写程序将2行3列的数组行列置换复制给3行2列的数组(即数组的转置).已经写了如下代码,请完善之: class y{ public static void main(String[ ...

  4. 优雅的敲JS代码的几个原则

    一.条件语句        1,使用 Array.includes 来处理多重 || 条件          // ----- 一般 ------ if (fruit == 'apple' || fr ...

  5. 【Flutter实战】移动技术发展史

    老孟导读:大家好,这是[Flutter实战]系列文章的第一篇,这并不是一篇Flutter技术文章,而是介绍智能手机操作系统.跨平台技术的演进以及我对各种跨平台技术看法的文章. 智能手机操作系统 塞班( ...

  6. Jmeter(八) - 从入门到精通 - JMeter配置元件(详解教程)

    1.简介 JMeter配置元件可以用来初始化默认值和变量,读取文件数据,设置公共请求参数,赋予变量值等,以便后续采样器使用.将在其作用域的初始化阶段处理.配置元件(Config Element)提供对 ...

  7. WinForm通用自动更新AutoUpdater项目实战

    目前我们做的上位机项目还是以Winform为主,在实际应用过程中,可能还会出现一些细节的修改.对于这种情况,如果上位机带有自动更新功能,我们只需要将更新后的应用程序打包放在指定的路径下,可以让用户自己 ...

  8. curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to storage.googleapis.com:443

    安装nvm的时候, ➜  ~ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash 错 ...

  9. javaweb之Servlet,http协议以及请求转发和重定向

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 一直用的框架开发,快连Servlet都忘了,此文旨在帮自己和大家回忆一下Servlet主要知识点.话不多说开始吧 用idea构建Servlet项 ...

  10. python基础:如何使用 pip 安装第三方库

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在这个生活中处处都是大数据和人工智能的时代,总是能在各种角落看到 Pyth ...