博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis 源码解析 —— SqlSessionFactory
阅读量:6499 次
发布时间:2019-06-24

本文共 3101 字,大约阅读时间需要 10 分钟。

本文主要分析SqlSessionFactory的构建过程

SqlSessionFactoryBuilder从XML中构建SqlSessionFactory

String resource = "org/mybatis/example/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

MyBatis 源码解析 —— SqlSessionFactory

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactoryBuilder用来创建SqlSessionFactory实例,一旦创建了SqlSessionFactory,就不再需要它了

public SqlSessionFactory build(InputStream inputStream) {  return build(inputStream, null, null);}

调用

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)

源码如下:

/**   * 根据配置创建SqlSessionFactory   *   * @param inputStream 配置文件输入流   * @param environment 环境名称   * @param properties  外部配置   * @return   */  public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {    try {      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);      //parser.parse()读取配置文件返回configuration      //build()根据返回的configuration创建SqlSessionFactory      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.      }    }  }

最终创建DefaultSqlSessionFactory实例

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

其中

XMLConfigBuilder与Configuration

MyBatis 源码解析 —— SqlSessionFactory

XMLConfigBuilder的方法parse()

public Configuration parse() {    if (parsed) {        throw new BuilderException("Each XMLConfigBuilder can only be used once.");    }    parsed = true;    //读取mybatis-config.xml配置信息,"configuration"是根结点    parseConfiguration(parser.evalNode("/configuration"));    return configuration;}

XMLConfigBuilder的方法parseConfiguration(XNode root)

/** * 读取配置文件组装configuration * @param root 配置文件的configuration节点 */private void parseConfiguration(XNode root) {    try {        //issue #117 read properties first        propertiesElement(root.evalNode("properties"));        typeAliasesElement(root.evalNode("typeAliases"));        pluginElement(root.evalNode("plugins"));        objectFactoryElement(root.evalNode("objectFactory"));        objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));        reflectionFactoryElement(root.evalNode("reflectionFactory"));        settingsElement(root.evalNode("settings"));        // read it after objectFactory and objectWrapperFactory issue #631        environmentsElement(root.evalNode("environments"));        databaseIdProviderElement(root.evalNode("databaseIdProvider"));        typeHandlerElement(root.evalNode("typeHandlers"));        mapperElement(root.evalNode("mappers"));    } catch (Exception e) {        throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);    }}

关于配置文件相关的源码分析参看:

设计模式

从SqlSessionFactory和Configuration的创建过程中可以看出它们都使用了建造者模式.

转载于:https://blog.51cto.com/14230003/2399633

你可能感兴趣的文章
struts2上传图片的全过程
查看>>
Java String.substring内存泄露?
查看>>
【安全运维】 linux 系统账户,网络,简易安全加固方案(第一部分),经测试可行...
查看>>
我的友情链接
查看>>
使用Powershell批量为Azure资源添加Tags
查看>>
AS3连线效果
查看>>
PL/SQL 中Returning Into的用法
查看>>
maven项目中 把依赖的jar包一起打包
查看>>
Svn 笔记—— Hooks
查看>>
详解zabbix中文版安装部署
查看>>
jetty9请求form表单太小限制
查看>>
红茶三杯的博客-一个IE的博客
查看>>
数组常用方法
查看>>
Unity3D提示“XX,some are mac os x (unix) and some are windows”
查看>>
JSTL 读取数组 和 字符串连接
查看>>
正则表达式基础
查看>>
系统基本安全优化
查看>>
linux中pipe
查看>>
c语言实现线性结构(数组与链表)
查看>>
docker容器网络 - 同一个host下的容器间通信
查看>>