• Mybatis源码解析(一)(2015年06月11日)


    一、简介

    先看看Mybatis的源码结构图,Mybatis3.2.7版本包含的包共计19个,其他版本可能会少。

    clipboard

    每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得,而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。获取SqlSessionFactory 之后便可以获取SqlSession,SqlSession中包含了一系列操作数据库的增删查改的方法。

    所以Mybatis的三个重要核心就是:SqlSessionFactoryBuilder 、SqlSessionFactory 、SqlSession

    二、源码解析

    1、SqlSessionFactoryBuilder

    SqlSessionFactoryBuilder 、SqlSessionFactory 、SqlSession这三个类都位于session包下,这是SqlSessionFactoryBuilder类结构图

    clipboard[1]

    类中的9个build方法都是为了创建并返回SqlSessionFactory对象,根据参数类型,实际上可以分为三类方法

    1.以Configuration对象为参数的创建

    2.以InputStream对象为参数的创建

    3.以Reader对象为参数的创建

    但实际上最重要的是以Configuration对象的build方法,因为以InputStream、Reader对象为参数的build方法最后都是通过读取xml配置文件,创建Configuration对象,并调用以Configuration对象为参数的build方法,最终返回DefaultSqlSessionFactory对象,以下是源码

    public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    SqlSessionFactory var5;
    try {
    XMLConfigBuilder e = new XMLConfigBuilder(reader, environment, properties);
    var5 = this.build((Configuration)e.parse());
    } catch (Exception var14) {
    throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
    } finally {
    ErrorContext.instance().reset();

    try {
    reader.close();
    } catch (IOException var13) {
    ;
    }

    }

    return var5;
    }
    public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    SqlSessionFactory var5;
    try {
    XMLConfigBuilder e = new XMLConfigBuilder(inputStream, environment, properties);
    var5 = this.build((Configuration)e.parse());
    } catch (Exception var14) {
    throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
    } finally {
    ErrorContext.instance().reset();

    try {
    inputStream.close();
    } catch (IOException var13) {
    ;
    }

    }

    return var5;
    }
    public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
    }

    2、SqlSessionFactory

    SqlSessionFactory是一个接口,其实真实干活的事它的实现类DefaultSqlSessionFactory,SqlSessionFactory顾名思义它是一个SqlSession的工厂类,其作用主要也是向外提供SqlSession,还有一个作用就是可以获取Configuration对象

    public interface SqlSessionFactory {
    SqlSession openSession();

    SqlSession openSession(boolean var1);

    SqlSession openSession(Connection var1);

    SqlSession openSession(TransactionIsolationLevel var1);

    SqlSession openSession(ExecutorType var1);

    SqlSession openSession(ExecutorType var1, boolean var2);

    SqlSession openSession(ExecutorType var1, TransactionIsolationLevel var2);

    SqlSession openSession(ExecutorType var1, Connection var2);

    Configuration getConfiguration();
    }

    提供8中获取SqlSession的方法,涉及的参数主要有:自定义连接、事物隔离级别、ExecutorType(Statement类型【普通、预处理、批处理】)

    这里需要注意的是openSession方法不是默认自动提交事物的。

    3、SqlSession

    SqlSession同样是一个接口,实际干活的也是它的实现类DefaultSqlSession,这是它的类结构图

    clipboard[2]

    从图中我们可以看出,SqlSession的作用主要是提供数据库的一些基本操作。

  • 相关阅读:
    google搜索教程
    phoenix/stack-five
    phoenix/stack-four
    phoenix/stack-three
    phoenix/stack-one
    fork 在 Linux 内核里面的实现
    无文件执行 ELF
    glibc 堆内存管理杂记
    QOS shaping 知识要点
    QOS CQ
  • 原文地址:https://www.cnblogs.com/Dreyer/p/4569237.html
Copyright © 2020-2023  润新知