第七章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个部分组成阀门分别是MappedStatement、SqlSource和BoundSql。

  • 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的过程:通过StatementHandler、ParameterHandler和ResultSetHandler来完成数据库操作和结果的返回。

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

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

  • prepared预编译SQL
  • parameterize设置参数
  • query/update执行SQL

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

  1. 互联网轻量级框架SSM-查缺补漏第八天(MyBatis插件plugin使用及原理)

    简言:今天进行第八天的记录(只是写了八天).有的时候看的多,有的时候看的少,看的少的时候就攒几天一起写了.而今天这个插件我昨天写了一下午,下班没写完就回去了,今天把尾收了,再加上一个过程图方便下面原理 ...

  2. Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8515304.html 一.AsyncTask的使用 AsyncTask是一种轻 ...

  3. Java EE互联网轻量级框架整合开发— SSM框架(中文版带书签)、原书代码

    Java EE互联网轻量级框架整合开发 第1部分 入门和技术基础 第1章 认识SSM框架和Redis 2 1.1 Spring框架 2 1.2 MyBatis简介 6 1.3 Spring MVC简介 ...

  4. 互联网轻量级框架SSM-查缺补漏第六天【级联+延迟加载特辑】

    简言:本来这是昨天看的,但是因为想好好写一下[级联]这个东西,所以就看完之后今天来整理一下. 级联 1. 什么是级联 级联是一个数据库实体的概念.比如教师就需要存在学生与之对应,这样就有教师学生表,一 ...

  5. 互联网轻量级框架SSM-查缺补漏第一天

    简言:工欲其事必先利其器,作为一个大四的准毕业生,在实习期准备抽空补一下基础.SSM框架作为互联网的主流框架,在会使用的基础上还要了解其原理,我觉得会对未来的职场会有帮助的.我特意的买了一本<J ...

  6. Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解

    上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas和Paint,从细节上更进一步的讲解自定 ...

  7. Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8387752.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  8. Android查缺补漏(IPC篇)-- 款进程通讯之AIDL详解

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  9. Android查缺补漏(IPC篇)-- 进程间通讯之AIDL详解

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

随机推荐

  1. JS延时器 定时器 暂停器 中断器

    // numberMillis 毫秒 function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() ...

  2. [BZOJ5212][ZJOI2018]历史

    传送门(洛谷) 人生第一道九条可怜……神仙操作…… 看着题解理解了一个早上才勉强看懂怎么回事…… 简化一下题目就是:已知每一个点access的总次数,求一个顺序使虚实边转化的次数最多 考虑一下,对于x ...

  3. myeclipse上down出的svn项目,文件后面不显示版本号和修改人

    找到 windows ->preferences->General->Appearance->Lable Decorations 下拉找到svn 勾选上

  4. 性能分析工具VisualVM for eclipse安装过程总结

    Java VisualVM Java VisualVM is a tool that provides a visual interface for viewing detailed informat ...

  5. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  6. 1016 部分A+B (15 分)

    // 题目不难,感觉变量定义的有点儿多了#include <iostream> #include <cmath> using namespace std; int main() ...

  7. SMB共享

    [root@samba1 ~]# yum install samba samba-client  samba-common -y 因为只有真实存在的用户才能在samba中建立,所以我们新建两个测试用户 ...

  8. (转)Linux-HA实战(1)— Heartbeat安装

    原文:http://blog.csdn.net/liaomin416100569/article/details/76087448-------centos7源代码编译安装heartbeat 原文:h ...

  9. vue-webpack项目中调试的问题

    在使用devtools的过程中,可以使用debugger.

  10. 卸载oracle10g

    网上搜集的.暂时先用着完全卸载Oracle方法:软件环境: 1.Windows XP + Oracle 10g 2.Oracle安装路径为:d:\Oracle 1.如果数据库配置了自动存储管理(ASM ...