Mybatis 系列2-配置文件
【Mybatis 系列10-结合源码解析mybatis 执行流程】
【Mybatis 系列8-结合源码解析select、resultMap的用法】
【Mybatis 系列7-结合源码解析核心CRUD配置及用法】
【Mybatis 系列6-结合源码解析节点配置objectFactory、databaseIdProvider、plugins、mappers】
【Mybatis 系列5-结合源码解析TypeHandler】
【Mybatis 系列4-结合源码解析节点typeAliases】
【Mybatis 系列3-结合源码解析properties节点和environments节点】
上篇文章 写了一个Demo简单体现了一下Mybatis的流程。
本次,将简单介绍一下Mybatis的配置文件:
上次例子中,我们以 SqlSessionFactoryBuilder 去创建 SqlSessionFactory,
那么,我们就先从SqlSessionFactoryBuilder入手, 咱们先看看源码是怎么实现的:
SqlSessionFactoryBuilder源码片段:
- public class SqlSessionFactoryBuilder {
- 2
- 3 //Reader读取mybatis配置文件,传入构造方法
- 4 //除了Reader外,其实还有对应的inputStream作为参数的构造方法,
- 5 //这也体现了mybatis配置的灵活性
- 6 public SqlSessionFactory build(Reader reader) {
- 7 return build(reader, null, null);
- 8 }
- 9
- 10 public SqlSessionFactory build(Reader reader, String environment) {
- 11 return build(reader, environment, null);
- 12 }
- 13
- 14 //mybatis配置文件 + properties, 此时mybatis配置文件中可以不配置properties,也能使用${}形式
- 15 public SqlSessionFactory build(Reader reader, Properties properties) {
- 16 return build(reader, null, properties);
- 17 }
- 18
- 19 //通过XMLConfigBuilder解析mybatis配置,然后创建SqlSessionFactory对象
- 20 public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
- 21 try {
- 22 XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
- 23 //下面看看这个方法的源码
- 24 return build(parser.parse());
- 25 } catch (Exception e) {
- 26 throw ExceptionFactory.wrapException("Error building SqlSession.", e);
- 27 } finally {
- 28 ErrorContext.instance().reset();
- 29 try {
- 30 reader.close();
- 31 } catch (IOException e) {
- 32 // Intentionally ignore. Prefer previous error.
- 33 }
- 34 }
- 35 }
- 36
- 37 public SqlSessionFactory build(Configuration config) {
- 38 return new DefaultSqlSessionFactory(config);
- 39 }
- 40
- 41 }
通过源码,我们可以看到SqlSessionFactoryBuilder 通过XMLConfigBuilder 去解析我们传入的mybatis的配置文件,
下面就接着看看 XMLConfigBuilder 部分源码:
- /**
- 2 * mybatis 配置文件解析
- 3 */
- 4 public class XMLConfigBuilder extends BaseBuilder {
- 5 public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
- 6 this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
- 7 }
- 8
- 9 private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
- 10 super(new Configuration());
- 11 ErrorContext.instance().resource("SQL Mapper Configuration");
- 12 this.configuration.setVariables(props);
- 13 this.parsed = false;
- 14 this.environment = environment;
- 15 this.parser = parser;
- 16 }
- 17
- 18 //外部调用此方法对mybatis配置文件进行解析
- 19 public Configuration parse() {
- 20 if (parsed) {
- 21 throw new BuilderException("Each XMLConfigBuilder can only be used once.");
- 22 }
- 23 parsed = true;
- 24 //从根节点configuration
- 25 parseConfiguration(parser.evalNode("/configuration"));
- 26 return configuration;
- 27 }
- 28
- 29 //此方法就是解析configuration节点下的子节点
- 30 //由此也可看出,我们在configuration下面能配置的节点为以下10个节点
- 31 private void parseConfiguration(XNode root) {
- 32 try {
- 33 propertiesElement(root.evalNode("properties")); //issue #117 read properties first
- 34 typeAliasesElement(root.evalNode("typeAliases"));
- 35 pluginElement(root.evalNode("plugins"));
- 36 objectFactoryElement(root.evalNode("objectFactory"));
- 37 objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
- 38 settingsElement(root.evalNode("settings"));
- 39 environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631
- 40 databaseIdProviderElement(root.evalNode("databaseIdProvider"));
- 41 typeHandlerElement(root.evalNode("typeHandlers"));
- 42 mapperElement(root.evalNode("mappers"));
- 43 } catch (Exception e) {
- 44 throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
- 45 }
- 46 }
- 47 }
通过以上源码,我们就能看出,在mybatis的配置文件中:
- configuration节点为根节点。
- 在configuration节点之下,我们可以配置10个子节点, 分别为:properties、typeAliases、plugins、objectFactory、objectWrapperFactory、settings、environments、databaseIdProvider、typeHandlers、mappers。
本篇文章就先只介绍这些内容,接下来的文章将依次分析解析这个10个节点中比较重要的几个节点的源码,看看在解析这些节点的时候,到底做了些什么。
Mybatis 系列2-配置文件的更多相关文章
- Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解
封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...
- Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突
原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html http://www.cnblogs.com/xdp-gacl/p/4264425.ht ...
- 深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete
上篇文章<深入浅出Mybatis系列(六)---objectFactory.plugins.mappers简介与配置>简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介 ...
- 深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置
上篇文章<深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)>简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习 ...
- 深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)>为大家介绍了mybatis中别名的使用,以及其源码.本篇将为大家介绍TypeH ...
- 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...
- 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根 ...
- 深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(一)---Mybatis入门>, 写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们 ...
- Mybatis 系列10
在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程 1. SqlSessionFactory 与 SqlSession. 通过前面的章 ...
- Mybatis 系列7
上篇系列6中 简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介绍mapper映射文件的配置. 这是mybatis的核心之一 一定要学好 在mapper文件中,以mapper作为根 ...
随机推荐
- baidu voice tts build
C++: g++ -c base64.cpp -o base64.o copy json.a curl.a to project root dir g++ sample.cpp -L. -lj ...
- C# to IL 1 Introduction to Microsoft’s IL(MSIL 介绍)
The code that we write in a programming language like C#, ASP+ or in any other .NETcompatible langua ...
- unity3d常用组件及分析
- 谈谈 在 .Net 生态里为什么没有 Hadoop 系列 ?
在 .Net 生态里为什么没有 Hadoop 系列 ? 有需要 有 Hadoop 系列 吗 ?
- nginx下js文件修改后访问不更新问题解决
今天遇到一个问题,nginx下js修改后不更新,加版本号,刷新浏览器缓存都不行,重启服务器才行,修改后又不更新了而且加载的js文件会有乱码或者文件加载不全的问题. 解决办法:修改nginx.conf, ...
- jmeter—JDBC request动态参数设置
jmeter—JDBC request动态参数设置 重要参数说明: Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable ...
- python获取代理IP并测试是否可用
# coding: utf-8 import urllib2 import re import time def getDL(page): url = 'http://www.xicidaili.co ...
- #ifdef __cplusplus extern "C" { #endif 含义
转载! 1.在好多程序中我们会遇到下面代码段 #ifdef __cplusplus extern "C" { #endif //c语法代码段 #if ...
- IntelliJ IDEA maven项目 ***
创建一个新Maven项目 new 一个project 不选择任何Maven模板 起个GroupId.ArifactId 起个项目名.注意:Idea_Project是存放此项目的工作区间,mavenDe ...
- navigator 判断移动端是Android还是iOS
let u = navigator.userAgent; let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...