• 互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)


     

    第七章MyBatis的解析和运行原理

      SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心借口SqlSession,所以要先创建SqlSessionFactory,为此要提供配置文件和相关的参数。MyBatis是一个复杂的系统,它采用了Builder模式去创建SqlSessionFactory,在实际上可以通过SqlSessionFactoryBuilder去创建,分为两步:

      

    SqlSessionFactory = new SqlSessionFactoryBuider().build(inputStream);

    • 第一步通过org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置XML文件,读取所有配置参数,并将读取的内容装入org.apache.ibatis.session.Configuration类对象中。而Configuration采用的事单例模式,几乎所有的MyBatis配置内容都会存放在这个单例对象中,以便后续将这些内容读出。
    • 第二步使用Configuration对象创建SqlSessionFactory,MyBatis中SqlSessionFactory是一个接口,而不是一个实现类,为此MyBatis提供一个默认的实现类org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。在大部分情况下都没有必要自己去创建新的SqlSessionFactory实现类。

      映射器的内部组成:

      当XMLConfigBuilder解析XML时,会将每一个SQL和其配置的内容保存起来。一般而言,在MyBatis中一条SQL和它相关的配置信息是由3个部分组成阀门分别是MappedStatementSqlSourceBoundSql

    • MappedStatement:的作用是保存一个映射器节点(select|insert|delete|update)的内容。他是一个类,包括许多我们配置的SQL、SQL的id、缓存信息、resultMap、parameterType、resultType、resultMap、languageDriver等重要配置内容。她还有一个重要的属性sqlSource,MyBatis通过读取它来获取某条SQL配置的所有信息。
    • sqlSource:提供BoundSql陪对象的地方,他是MappedStatement的一个属性。它是一个接口。自定义了一个接口方法getBoundSql(parameterObject),使用它可以得到一个BoundSql对象。
    • BoundSql:是一个结果对象,对于最终的参数和SQL都反映在BoundSql类对象上。BoundSql有三个主要的属性:parameterMappings、parameterObject和sql
      • parameterObject:为参数本身,可以传递简单对象、POJO或者Map
      • parameterMappings是一个List,它的每一个元素都是ParameterMapping对象。对象会描述参数,参数包括属性名称、表达式、javaType、jdbcType、typrHandler等重要信息
      • sql属性就是书写在映射器里面的一条被SqlSource解析后的SQL

      SqlSession运行过程

      注:这里的代码作为例子。图为代码运行过程的流程图。

      

      SqlSession处理SQL的过程:通过StatementHandlerParameterHandlerResultSetHandler来完成数据库操作和结果的返回。

    • Executor:代表执行器,由他来调度其他对象来执行对应的SQL。SqlSession其实是一个门面,真正干活的是执行器,它是一个真正执行Java和数据库交互的对象。
    • StatementHandler:作用是使用数据库的Statement(例如PreparedStatement)执行操作,它很重要。
    • ParameterHandler:是用来处理SQL参数的。
    • ResultSetHandler:是进行数据集(ResultSet)的封装返回处理的。

      总结:SqlSession内部运行图如下:

    • prepared预编译SQL
    • parameterize设置参数
    • query/update执行SQL
  • 相关阅读:
    参数innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况
    innodb_fast_shutdown的内幕
    MySQL关闭过程详解和安全关闭MySQL的方法
    MySQL优化之Explain命令解读,optimizer_trace
    使用Amanda ZRM备份远程MySQL数据库
    类Unix上5个最佳开源备份工具 Bacula/Amanda/Backupninja/Backuppc/UrBackup
    获取 MySQL 崩溃时的 core file
    使用mysqldump备份时为什么要加上 -q 参数(5.7默认为on)
    关联与下钻:快速定位MySQL性能瓶颈的制胜手段
    MySQL安全策略
  • 原文地址:https://www.cnblogs.com/shiboinfo/p/10209758.html
Copyright © 2020-2023  润新知