0.总概

 
1.SqlSessionFactory在mybatis只要创建一次;
import com.suntek.vdm.gw.util.AESEncipher;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.*;
import java.util.Properties; /**
* @author Binglong
*/
public class MybatisUtils { private static SqlSessionFactory factory=null;
/**
* 获取SqlSessionFactory,只创建一次
* @return SqlSessionFactory
*/
private static SqlSessionFactory getSqlSessionFactory() {
if (null != factory){
return factory;
}
synchronized (SqlSessionFactory.class){
factory = getFactory();
}
return factory;
} private static SqlSessionFactory getFactory() {
try {
//读取配置文件
Reader reader= Resources.getResourceAsReader("mybatis.xml");
//创建SQLSessionFactory
return new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
classpath路径下的mybatis.xml配置文件(以后详解配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入配置-->
<properties resource="conf/db.properties"/>
<!--sql打印 -->
<!--<settings>-->
<!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
<!--</settings>--> <environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<!--<property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>-->
<property name="url" value="${url}"/>
<!--<property name="username" value="${username}"/>-->
<!--<property name="password" value="${password}"/>-->
<!--poolMaximumIdleConnections是空闲连接数,就是没有处理请求的连接,默认是5-->
<property name="poolMaximumIdleConnections" value="5"/>
<!--poolMaximumActiveConnections是最大的活动连接数,活动连接,就是正在与数据库交互的连接,默认是10-->
<property name="poolMaximumActiveConnections" value="50"/>
<!--<property name="poolPingQuery" value="SELECT 1 FROM VDM_VR_NODE" />-->
<!--<property name="poolPingEnabled" value="true" />-->
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="com/ned/gw/mapping/UserMapper.xml"></mapper>
</mappers>
</configuration>
2.SqlSessionFactoryBuilder构建
从上面可以看到,SqlSessionFactory主要是由SqlSessionFactoryBuilder创建,而SqlSessionFactoryBuilder提供了两种方法创建,一种基于Reader,另一种基于InputStream;两种方式都是把配置封装成XMLConfigBuilder,然后通过 new DefaultSqlSessionFactory(config)创建;
有构造方法可以看,也要传入Properties 配置;
aaarticlea/png;base64,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" alt="" />
package org.apache.ibatis.session;

import java.io.*;
import java.util.Properties;
import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.exceptions.ExceptionFactory;
import org.apache.ibatis.executor.ErrorContext;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; public class SqlSessionFactoryBuilder {
public SqlSessionFactoryBuilder() {
}
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
var5 = this
.build(parser.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 parser = new XMLConfigBuilder(inputStream, environment, properties);
var5 = this
.build(parser.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);
}
}
3.XMLConfigBuilder解析
a.而XMLConfigBuilder最终把Reader和InputStream都封装成一个XPathParser(从字面上看估计是一个路径解析器);
b.获取到XMLConfigBuilder,还调用了其parse()方法,也就是解析配置文件(解析详情以后分析);
c.最终把所有配置封装在Configuration中,而这个Configuration正是SqlSessioFactory实现类DefaultSqlSessioFactory的重要属性;
值得关注的是这里XMLConfigBuilder创建时Properties props参数
public class XMLConfigBuilder extends BaseBuilder {
private boolean parsed;
private XPathParser parser;
private String environment; private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
super(new Configuration());
ErrorContext.instance().resource("SQL Mapper Configuration");
this.configuration.setVariables(props);
this.parsed = false;
this.environment = environment;
this.parser = parser;
} //解析
public Configuration parse() {
if (this.parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
} else {
this.parsed = true;
//从配置文件configuration节点作为根节点开始
this.parseConfiguration(this.parser.evalNode("/configuration"));
return this.configuration;
}
} //从这里可以看到,解析是按顺序解析,也就是平时配置文件的标签顺序
private void parseConfiguration(XNode root) {
try {
this.propertiesElement(root.evalNode("properties"));
this.typeAliasesElement(root.evalNode("typeAliases"));
this.pluginElement(root.evalNode("plugins"));
this.objectFactoryElement(root.evalNode("objectFactory"));
this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
this.settingsElement(root.evalNode("settings"));
this.environmentsElement(root.evalNode("environments"));
this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));
this.typeHandlerElement(root.evalNode("typeHandlers"));
this.mapperElement(root.evalNode("mappers"));
} catch (Exception var3) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3);
}
} }
public class XPathParser {
private Document document ;
private boolean validation; //是否开启验证
private EntityResolver entityResolver ; //用于加载本地D T D 文件
private Properties variables ; // mybatis.xml 中<propteries> 标签定义的键位对集合
private XPath xpath ; // XPath 对象
}
public class DefaultSqlSessionFactory implements SqlSessionFactory {
private final Configuration configuration;
…………
}
4.总结
SqlSessionFactory创建过程是把配置文件通过InputStream或Reader两种方式传到SqlSessionFactoryBuilder,然后SqlSessionFactoryBuilder创建一个XMLConfigBuilder,把配置信息放到XMLConfigBuilder中然后调用parse方法进行一系列解析,最终生成一个Configuration,而这个Configuration正式DefaultSqlSessionFactory的唯一属性,也就是把Configuration传入new一个DefaultSqlSessionFactory;
 
 
遗留问题
mybaitis.xml解析解析细节;
Configuration类;
 
 
 

源码-mybatis-01-SqlSessionFactory创建的更多相关文章

  1. mybatis源码分析(1)——SqlSessionFactory实例的产生过程

    在使用mybatis框架时,第一步就需要产生SqlSessionFactory类的实例(相当于是产生连接池),通过调用SqlSessionFactoryBuilder类的实例的build方法来完成.下 ...

  2. Mybatis源码分析之SqlSessionFactory(一)

    简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBa ...

  3. 【iScroll源码学习01】准备阶段 - 叶小钗

    [iScroll源码学习01]准备阶段 - 叶小钗 时间 2013-12-29 18:41:00 博客园-原创精华区 原文  http://www.cnblogs.com/yexiaochai/p/3 ...

  4. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

  5. dubbo源码分析1-reference bean创建

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  6. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  7. NIO 源码分析(01) NIO 最简用法

    目录 一.服务端 二.客户端 NIO 源码分析(01) NIO 最简用法 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) J ...

  8. AOP源码解析之二-创建AOP代理前传,获取AOP信息

    AOP源码解析之二-创建AOP代理前传,获取AOP信息. 上篇文章对AOP的基本概念说清楚了,那么接下来的AOP还剩下两个大的步骤获取定义的AOP信息,生成代理对象扔到beanFactory中. 本篇 ...

  9. myBatis源码学习之SqlSessionFactory

    上一篇博客 SqlSessionFactoryBuilder 中介绍了它的作用就是获得DefaultSqlSessionFactory SqlSessionFactory是一个接口,其具体实现类是De ...

  10. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

随机推荐

  1. sqlserver 2014使用时有Cannot find one or more components

    好久没用sqlserver,今天打开却出现了一个错误,Cannot find one or more components,令人头疼.在启动Microsoft SQL Server Managemen ...

  2. Hybrid APP之Native和H5页面交互原理

    Hybrid APP之Native和H5页面交互原理 Hybrid APP的关键是原生页面与H5页面直接的交互,如下图,痛过JSBridge,H5页面可以调用Native的api,Native也可调用 ...

  3. java的环境变量配置失败(java.exe、javaw.exe、javaws.exe优先级问题冲突)

    前言:首先安装了intelliJ Idea 其次安装了JDK 1.8 配置完三个系统变量后,java和javac执行不通过 配置过程 1.我的电脑(右键)--->属性---->高级---& ...

  4. IDEA Can't Update No tracked branch configured for branch master or the branch doesn't exist.

    IDEA Can't Update No tracked branch configured for branch master or the branch doesn't exist.To make ...

  5. ubuntu 安装 google Gtest [转]有效性待验证

    最近在做一些东西,用过gtest,废话少说,现讲其再ubuntu上安装的 方法贴出来,以供朋友们参考: 安装gtest分三步: 1.安装源代码 在ubuntu的桌面上,右键选择打开终端,在终端中输入如 ...

  6. 利用ELK分析Nginx日志生产实战(高清多图)

    本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意 ...

  7. JVN的理解

    写的很不错,通俗易懂:http://www.cnblogs.com/leefreeman/p/7344460.html

  8. java核心卷笔记--P48字符串3.6.5

    一定不要使用 == 运算符检测两个字符串是否相等 ! 这个运算符只能够确定两个字串是否放置在同一个位置上 . 当然 , 如果字符串放置在同一个位置上 , 它们必然相等. 但是 ,完全有可能将内容相同的 ...

  9. IntelliJ IDEA远程调试(Debug)Tomcat

    为什么需要这么做? 解决 在我本地是好的啊 这个世界性难题- 测试环境碰到问题,直接连上debug,不用再测试本地,再查看测试环境日志 遇到一些诡异的问题,日志是看不出端倪的 调试一些只能在测试环境执 ...

  10. [BZOJ 1095] [ZJOI 2007] 捉迷藏

    Description 传送门 Solution 先将原树转化成点分树: 然后维护三个堆: \(c[i]\) 保存点分树中子树 \(i\) 中的黑色节点到 \(fa[i]\) 的距离: \(b[i]\ ...