mybatis源码分析(1)——SqlSessionFactory实例的产生过程
来源:互联网 发布:vc c语言 编辑:程序博客网 时间:2024/05/04 01:59
在使用mybatis框架时,第一步就需要产生SqlSessionFactory类的实例(相当于是产生连接池),通过调用SqlSessionFactoryBuilder类的实例的build方法来完成。下面具体对这一过程涉及的源码进行分析。
首先用Eclipse工具查看SqlSessionFactoryBuilder类的Outline视图:
从上图中可以看出,SqlSessionFactoryBuilder类负责构建SqlSessionFactory,并且提供了多个build的重载方法。但其实很多都是在调同一签名的方法,例如:
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties),只是由于方法参数environment和propertiese都可以为null,
所以为了提供调用的便利性,才提供了下面的三个方法:
public SqlSessionFactory build(InputStream inputStream)public SqlSessionFactory build(InputStream inputStream, String environment) public SqlSessionFactory build(InputStream inputStream, Properties properties)
按照上述思路去除重复的,真正的重载方法只有如下三种:
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) public SqlSessionFactory build(Reader reader, String environment, Properties properties)public SqlSessionFactory build(Configuration config)
可以看出,配置信息可以以三种形式提供给SqlSessionFactory的build方法,分别是InputStream(字节流)、Reader(字符流)、Configuration(类),由于字节流与字符流都属于读取配置文件的方式,所以从配置信息的来源就很容易想到构建一个SqlSessionFactory有两种方式,大致代码如下:
(1) 读取xml文件构造方式
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream) ;
(2) 编程构造方式
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);Configuration configuration = new Configuration(environment);configuration.addMapper(BlogMapper.class);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration) ;
下面先来分析XML文件构造方式的build方法的源码:
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return build(parser.parse()); } catch (Exception e) { throw ExceptionFactory.wrapException("Error building SqlSession.", e); } finally { ErrorContext.instance().reset(); try { inputStream.close(); } catch (IOException e) { // Intentionally ignore. Prefer previous error. } } }
通过上面这几行代码,就能看出基于XML文件的这种构造方式,通过从XML中读取信息的工作之后,也是构造出Configuration对象之后再继续进行SqlSessionFactory的构建工作的,只是多了些XML的解析工作,所以我们只需单刀直入,直按分析编程构造方式的代码就可以了,或者是直接分析build(parser.parse())这句代码(参数产生过程先跳过)
编程构造方式的build方法源码如下(基于xml的构造方式的build(parser.parse())最终也是调了这个代码):
public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
其实这么看来SqlSessionFactory在mybatis的默认实现类为org.apache.ibatis.session.defaults.DefaultSqlSessionFactory ,其构造过程主要是注入了Configuration的实例对象,Configuration的实例对象即可通过解析xml配置文件产生,也可能通过代码直接构造。以上代码使用了一个设计模式:建设者模式(Builder),SqlSessionFactoryBuilder扮演具体的建造者,Configuration类则负责建造的细节工作,SqlSession则是建造出来的产品。
以下是类图和建造者模式的基本形态图,读者自行对照阅读。
构造者模式是一种对象的创建模式。它可以将一个复杂对象的内部构成特征与对象的构建过程完全分开。
- mybatis源码分析——SqlSessionFactory实例的产生过程
- MyBatis源码分析——SqlSessionFactory实例的产生过程
- mybatis源码分析(1)——SqlSessionFactory实例的产生过程
- mybatis源码学习之执行过程分析(1)——SqlSessionFactory及SqlSession的创建
- Mybatis 源码分析一、 SqlSessionFactory的创建过程
- MyBatis学习总结(二)——SQLSessionFactory实例
- MyBatis启动:SqlSessionFactory的建立过程
- 在MyBatis中 SqlSessionFactory的创建过程
- MyBatis启动:SqlSessionFactory的建立过程
- Mybatis SqlSessionFactory创建过程
- Mybatis源码分析一(SqlsessionFactory及源码整体结构)
- 【Mybatis源码阅读之SqlSessionFactory 何时实例化】
- Mybatis源码分析(二)- SqlSessionFactory和SqlSession详解
- Mybatis源码分析之SqlSessionFactory,SqlSession和连接池
- myBatis源码学习之SqlSessionFactory
- mybatis的sqlsessionFactory
- MyBatis 源码分析——生成Statement接口实例
- MyBatis 源码分析——生成Statement接口实例
- POJ - 3415 Common Substrings 后缀数组+单调栈+前缀和
- sublime 汉化 Ubuntu
- 直播技术
- mysql 使用group by with rollup分组聚合信息
- JS中的call、apply、bind方法
- mybatis源码分析(1)——SqlSessionFactory实例的产生过程
- C++中利用文件输入对象(即ifstream对象)来读取文本文件中带空格的字符串以及混合输入数字与字符串
- 随想2017
- try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
- 谷歌cartogrpher实现导航
- TF教程1:简要介绍
- android studio Error:(1, 1) 错误: 非法字符: '\ufeff' 解决方案
- 2017-02-16
- 点击手势