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源码分析(1)——SqlSessionFactory实例的产生过程
在使用mybatis框架时,第一步就需要产生SqlSessionFactory类的实例(相当于是产生连接池),通过调用SqlSessionFactoryBuilder类的实例的build方法来完成.下 ...
- Mybatis源码分析之SqlSessionFactory(一)
简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBa ...
- 【iScroll源码学习01】准备阶段 - 叶小钗
[iScroll源码学习01]准备阶段 - 叶小钗 时间 2013-12-29 18:41:00 博客园-原创精华区 原文 http://www.cnblogs.com/yexiaochai/p/3 ...
- 一个由正则表达式引发的血案 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. 一些特殊字符,如“&”,“- ...
- dubbo源码分析1-reference bean创建
dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
- NIO 源码分析(01) NIO 最简用法
目录 一.服务端 二.客户端 NIO 源码分析(01) NIO 最简用法 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) J ...
- AOP源码解析之二-创建AOP代理前传,获取AOP信息
AOP源码解析之二-创建AOP代理前传,获取AOP信息. 上篇文章对AOP的基本概念说清楚了,那么接下来的AOP还剩下两个大的步骤获取定义的AOP信息,生成代理对象扔到beanFactory中. 本篇 ...
- myBatis源码学习之SqlSessionFactory
上一篇博客 SqlSessionFactoryBuilder 中介绍了它的作用就是获得DefaultSqlSessionFactory SqlSessionFactory是一个接口,其具体实现类是De ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
随机推荐
- Numpy库的学习(五)
今天继续学习一下Numpy库,废话不多说,整起走 先说下Numpy中,经常会犯错的地方,就是数据的复制 这个问题不仅仅是在numpy中有,其他地方也同样会出现 import numpy as np a ...
- Sql Server 完全卸载,卸载干净,Windows 7。
一般卸载程序的卸载方法无法完全清除SqlServer 导致重装sqlserver报错,下面给大家介绍和讲解如何完全卸载Sql Server. (此教程使用的系统为Windows 7[Win10,Win ...
- 为什么不能在 body 标签的前面的 script 标签中定义 JS 全局变量?
<!DOCTYPE html> <!-- 为什么不能在 body 标签的前面的 script 标签中定义 JS 全局变量? 在全局环境下的代码就是在页面加载阶段从上到下一边加载一边执 ...
- 牛津初阶字典单词F-联想故事
从前有一个fable寓言,讲的是奥巴马穿着棉fabrics织物,走在去往学校的路上,他的心情fabulous极好的,绝妙的.因为他学校的facilities 设施fabulous非常棒,但有些人不喜欢 ...
- 如莲开发平台(MIS基础框架、Java技术、B/S结构)
关于 「如莲」是一套MIS类系统基础框架,主要用于各类“管理信息系统”的开发,也适合做网站后台开发.可省去开发时的框架搭建.规范约定.权限管理等基础工作,直接专注于业务功能实现. 「如 ...
- Navicat Premium 12.1.16.0安装与激活
声明:本文所提供的所有软件均来自于互联网,仅供个人研究和学习使用,请勿用于商业用途,下载后请于24小时内删除,请支持正版! 本文介绍Navicat Premium 12的安装.激活与基本使用.已于20 ...
- SQL 语法使用
SQL 语句 语句 语法 AND / OR SELECT column_name(s)FROM table_nameWHERE conditionAND|OR condition ALTER TABL ...
- 移动端和PC端弹出遮罩层后,页面禁止滚动的解决方法及探究
PC端解决方案 pc端的解决思路就是在弹出遮罩层的时候取消已经存在的滚动条,达到无法滚动的效果. 也就是说给body添加overflow:hidden属性即可,IE6.7下不会生效,需要给html增加 ...
- js 发送短信倒计时、秒杀倒计时实现代码
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- java 开发工具记录
jenkins 持续构建项目 lombok 优雅代码插件 sonarqube 代码检测插件