SqlSession build:

  

  ExecutorType :SIMPLE ,REUSE, BATCH,

    SIMPLE 为默认执行器;

    REUSE 为可重用执行器,重用Statement,执行器会缓存同一个sql Statement,不重复创建。

    BTACH 为批量更新执行器。会重用重用预处理语句,该模式下insert,update,delete的返回值将无意义,也可通过设置修改。

生命周期及作用域:

    SqlSessionFactoryBuilder: 方法作用域,该类用于创建SQLSessionFactory,一旦创建完后,就可以丢弃。

    SQLSessionFactory:应用作用域,创建后可在应用运行期间一直存在。不需要重复创建。适用于单例模式。

    SqlSession:请求或方法作用域,该类的实例是线程不安全的,因此用完之后即销毁;

  

  SQL执行流程:

    

  这里通过SQLSession中的selectList("statementId")方法查看主要的方法栈:

  

  其中包含了mybatis缓存处理、Intercepter(拦截器)的处理等操作。最终执行jdbc的Sql操作是由StatementHandler来完成。mybatis中sql mapper会转化为BoundSql,BoundSql包含了可执行sql,参数、参数类型等信息。

  StatementType : STATEMENT,PREPARED,CALLABLE

    STATEMENT: 直接执行sql,非预编译; 处理类:SimpleStatementHandler

    PREPARED:预编译处理;处理类:PreparedStatementHandler

    CALLABLE:执行存储过程;处理类:CallableStatementHandler

  StatementHandler:该接口有BaseStatementHandler和RoutingStatementHandler两个实现类。BaseStatementHandler 存在3个子类,分别对应StatementType的三种类型;BaseStatementHandler 中包含了ResultSetHandler和ParameterHandler

  StatementHandler执行sql后,会把结果交给ResultHandler来把查询结果转化为java对应的对象集合。handleResultSets()

  

 1   //处理ResultSet结果集
2 @Override
3 public List<Object> handleResultSets(Statement stmt) throws SQLException {
4 ErrorContext.instance().activity("handling results").object(mappedStatement.getId());
5 //用于存放查询的结果对象结合,多个ResultSet集合;每个Object对应一个ResultSet,每个Object对应的是一个List<Object>对象
6 //一般的查询只存在一个ResultSet,执行存储过程时会有多个ResultSet的情况,一般情况下multipleResults只有一个元素。
7 final List<Object> multipleResults = new ArrayList<Object>();
8
9 int resultSetCount = 0;
10 //获得第一个ResultSet对象 封装成ResultSetWrapper,主要包含了columnName、classNames、jdbcTypes
11 ResultSetWrapper rsw = getFirstResultSet(stmt);
12 //结构与multipleResults一致。
13 List<ResultMap> resultMaps = mappedStatement.getResultMaps();
14 //resultMapCount = 1
15 int resultMapCount = resultMaps.size();
16 validateResultMapsCount(rsw, resultMapCount);
17 while (rsw != null && resultMapCount > resultSetCount) {
18 //获得ResultMap对象
19 ResultMap resultMap = resultMaps.get(resultSetCount);
20 //处理ResultSet,将结果添加到multipleResults中
21 handleResultSet(rsw, resultMap, multipleResults, null);
22 //获取下一个ResultSet,并封装成ResultSetWrapper
23 rsw = getNextResultSet(stmt);
24 //清理
25 cleanUpAfterHandlingResultSet();
26 resultSetCount++;
27 }
28 //多个ResultSet结合情况下,执行存储过程时会使用
29 String[] resultSets = mappedStatement.getResultSets();
30 if (resultSets != null) {
31 while (rsw != null && resultSetCount < resultSets.length) {
32 ResultMapping parentMapping = nextResultMaps.get(resultSets[resultSetCount]);
33 if (parentMapping != null) {
34 String nestedResultMapId = parentMapping.getNestedResultMapId();
35 ResultMap resultMap = configuration.getResultMap(nestedResultMapId);
36 handleResultSet(rsw, resultMap, null, parentMapping);
37 }
38 rsw = getNextResultSet(stmt);
39 cleanUpAfterHandlingResultSet();
40 resultSetCount++;
41 }
42 }
43
44 return collapseSingleResultList(multipleResults);
45 }
handleResultSet()
 1   //处理
2 private void handleResultSet(ResultSetWrapper rsw, ResultMap resultMap, List<Object> multipleResults, ResultMapping parentMapping) throws SQLException {
3 try {
4 if (parentMapping != null) {
5 //适用于存储过程,多个ResultSet的情况
6 handleRowValues(rsw, resultMap, null, RowBounds.DEFAULT, parentMapping);
7 } else {
8 //如果没有自定义ResultHandler,则使用DefaultResultHandler
9 if (resultHandler == null) {
10 DefaultResultHandler defaultResultHandler = new DefaultResultHandler(objectFactory);
11 handleRowValues(rsw, resultMap, defaultResultHandler, rowBounds, null);
12 multipleResults.add(defaultResultHandler.getResultList());
13 } else {
14 //处理ResultSet的每一行结果
15 handleRowValues(rsw, resultMap, resultHandler, rowBounds, null);
16 }
17 }
18 } finally {
19 // issue #228 (close resultsets)
20 closeResultSet(rsw.getResultSet());
21 }
22 }

Mybatis日记的更多相关文章

  1. MyBatis日记(五):一对一关系,一对多关系

    一对一关系: 首先在数据库中新增地址表(t_address)用于存储人员的地址信息: CREATE TABLE `t_address` ( `id` ) NOT NULL AUTO_INCREMENT ...

  2. MyBatis日记(四):MyBatis——insert、update、delete、select

    MyBatis简单增删改查操作,此处所做操作,皆是在之前创建的MyBatis的Hello world的工程基础上所做操作. 首先在接口文件(personMapper.java)中,添加操作方法: pa ...

  3. myBatis 日记

    一级缓存默认开启, 有效范围是在当前sqlsession, 同一个SqlSession对象执行相同的sql并参数也要相同,缓存才有效. 在同一个会话里面,多次执行相同的SQL 语句,会直接从内存取到缓 ...

  4. mybatis日记配置Log4j

    拷贝log4j-1.2.16.jar到项目lib下 方式一是在src下新建一个log4j.xml文件,其具体内容如下 <?xml version="1.0" encoding ...

  5. MYbatis调试日记(三)

    如何在Mybatis中插入日期类型的数据 直接见代码: xml配置文件 java代码

  6. mybatis学习日记-day01

    Mybatis说明: MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的 ...

  7. MyBatis学习日记(三):戏说MyBatis配置文件

    properties标签 properties标签可以用来加载别的配置文件,比如可以加载数据库的配置文件,jdbc.properties. 下面是jdbc.properties jdbc.driver ...

  8. MyBatis学习日记(二): MyBatis Say Hello

    首先在Eclipse中创建一个maven工程: 在maven工程下的pom.xml文件中添加MyBatis.MySQL.Junit依赖: <project xmlns="http:// ...

  9. MyBatis学习日记(一):拜见小主——MyBatis

    近日学习MyBatis,特将学习过程及一点心得记录于此. MyBatis为何物? MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC ...

随机推荐

  1. P5035金坷垃题解(快速幂的讲解)

      首先经过读题,我们发现找到合格的金坷垃,怎么样的金坷垃才是合格的呢?(我们不难发现1肯定是合格的[题目已经给出了]) 然后我们开始手推一下之后合格的金坷垃: 2-1=1(合格) 3-1-1=1(不 ...

  2. 087 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 01 封装的概念和特点

    087 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 01 封装的概念和特点 本文知识点:封装的概念和特点 说明:因为时间紧张,本人写博客过程中只是对 ...

  3. 【漏洞复现】WinRAR目录穿越漏洞(CVE-2018-20250)复现

    前言 这漏洞出来几天了,之前没怎么关注,但是这两天发现开始有利用这个漏洞进行挖矿和病毒传播了,于是想动手复现一波. WinRAR 代码执行相关的CVE 编号如下: CVE-2018-20250,CVE ...

  4. PHP添加新扩展包的步骤

    1.找到PHP解压包,将   php.ini-development   这个文件复制一份,并修改后缀名为  .ini 2.将这个文件打开,将此处注释解开, 3.配置你扩展的该包的位置 4.如果显示不 ...

  5. Jmeter JDBC Request 使用详解

    本篇博文讲解以MySQL为例,搞懂JDBC Request中MySQL的使用方法,换成其它数据库, 如Oracle.PSQL也会很容易上手. 一.基本配置 1.首先我们先了解一下,不同数据库的驱动类和 ...

  6. vue : 无法加载文件 C:\Users\Lenovo\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。

    第一步:用管理员身份打开 第二步:执行:set-ExecutionPolicy RemoteSigned 选择Y或A,回车

  7. C# 软件版本号

    如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! ! --------------------------- ...

  8. Acticiti流程引擎在已知当前流程定义id的情况下获取当前流程的所有信息(包括:节点和连线)

    这里我们已知流程已经部署,我的需求是获取当前流程的所有任务节点,我使用instanceof关键字来进行匹配 private List<UserTask> getProcessUserTas ...

  9. 多测师讲解ui自动化框架设计思想_高级讲师肖sir

    UI自动化框架:UI自动化框架可以分为8个模块,conf.data.public.pageobject.testcase.runner.report.log.conf是用来储存系统环境.数据库.邮件的 ...

  10. Flask之WTF

    Flask-WTF是什么? 是一个关于表单的扩展库,可以自动生成表单的HTML代码和验证提交的表单数据,并且提供跨站请求伪造(Cross-Site Request Forgery)保护的功能,使用非常 ...