首页 > 学院 > 开发设计 > 正文

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

2019-11-15 00:33:39
字体:
来源:转载
供稿:网友
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的作用主要是提供数据库的一些基本操作。


上一篇:java中的递归方法

下一篇:SSH免登陆

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表