【Mybatis 系列10-结合源码解析mybatis 执行流程】

【Mybatis 系列9-强大的动态sql 语句】

【Mybatis 系列8-结合源码解析select、resultMap的用法】

【Mybatis 系列7-结合源码解析核心CRUD配置及用法】

【Mybatis 系列6-结合源码解析节点配置objectFactory、databaseIdProvider、plugins、mappers】

【Mybatis 系列5-结合源码解析TypeHandler】

【Mybatis 系列4-结合源码解析节点typeAliases】

【Mybatis 系列3-结合源码解析properties节点和environments节点】

【Mybatis 系列2-配置文件】

【Mybatis 系列1-环境搭建】

上篇文章 写了一个Demo简单体现了一下Mybatis的流程。

本次,将简单介绍一下Mybatis的配置文件

上次例子中,我们以 SqlSessionFactoryBuilder 去创建 SqlSessionFactory,

那么,我们就先从SqlSessionFactoryBuilder入手, 咱们先看看源码是怎么实现的:

SqlSessionFactoryBuilder源码片段:

  1. public class SqlSessionFactoryBuilder {
  2. 2
  3. 3 //Reader读取mybatis配置文件,传入构造方法
  4. 4 //除了Reader外,其实还有对应的inputStream作为参数的构造方法,
  5. 5 //这也体现了mybatis配置的灵活性
  6. 6 public SqlSessionFactory build(Reader reader) {
  7. 7 return build(reader, null, null);
  8. 8 }
  9. 9
  10. 10 public SqlSessionFactory build(Reader reader, String environment) {
  11. 11 return build(reader, environment, null);
  12. 12 }
  13. 13
  14. 14 //mybatis配置文件 + properties, 此时mybatis配置文件中可以不配置properties,也能使用${}形式
  15. 15 public SqlSessionFactory build(Reader reader, Properties properties) {
  16. 16 return build(reader, null, properties);
  17. 17 }
  18. 18
  19. 19 //通过XMLConfigBuilder解析mybatis配置,然后创建SqlSessionFactory对象
  20. 20 public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
  21. 21 try {
  22. 22 XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
  23. 23 //下面看看这个方法的源码
  24. 24 return build(parser.parse());
  25. 25 } catch (Exception e) {
  26. 26 throw ExceptionFactory.wrapException("Error building SqlSession.", e);
  27. 27 } finally {
  28. 28 ErrorContext.instance().reset();
  29. 29 try {
  30. 30 reader.close();
  31. 31 } catch (IOException e) {
  32. 32 // Intentionally ignore. Prefer previous error.
  33. 33 }
  34. 34 }
  35. 35 }
  36. 36
  37. 37 public SqlSessionFactory build(Configuration config) {
  38. 38 return new DefaultSqlSessionFactory(config);
  39. 39 }
  40. 40
  41. 41 }

通过源码,我们可以看到SqlSessionFactoryBuilder 通过XMLConfigBuilder 去解析我们传入的mybatis的配置文件,

下面就接着看看 XMLConfigBuilder 部分源码:

  1. /**
  2. 2 * mybatis 配置文件解析
  3. 3 */
  4. 4 public class XMLConfigBuilder extends BaseBuilder {
  5. 5 public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
  6. 6 this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
  7. 7 }
  8. 8
  9. 9 private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
  10. 10 super(new Configuration());
  11. 11 ErrorContext.instance().resource("SQL Mapper Configuration");
  12. 12 this.configuration.setVariables(props);
  13. 13 this.parsed = false;
  14. 14 this.environment = environment;
  15. 15 this.parser = parser;
  16. 16 }
  17. 17
  18. 18 //外部调用此方法对mybatis配置文件进行解析
  19. 19 public Configuration parse() {
  20. 20 if (parsed) {
  21. 21 throw new BuilderException("Each XMLConfigBuilder can only be used once.");
  22. 22 }
  23. 23 parsed = true;
  24. 24 //从根节点configuration
  25. 25 parseConfiguration(parser.evalNode("/configuration"));
  26. 26 return configuration;
  27. 27 }
  28. 28
  29. 29 //此方法就是解析configuration节点下的子节点
  30. 30 //由此也可看出,我们在configuration下面能配置的节点为以下10个节点
  31. 31 private void parseConfiguration(XNode root) {
  32. 32 try {
  33. 33 propertiesElement(root.evalNode("properties")); //issue #117 read properties first
  34. 34 typeAliasesElement(root.evalNode("typeAliases"));
  35. 35 pluginElement(root.evalNode("plugins"));
  36. 36 objectFactoryElement(root.evalNode("objectFactory"));
  37. 37 objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
  38. 38 settingsElement(root.evalNode("settings"));
  39. 39 environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631
  40. 40 databaseIdProviderElement(root.evalNode("databaseIdProvider"));
  41. 41 typeHandlerElement(root.evalNode("typeHandlers"));
  42. 42 mapperElement(root.evalNode("mappers"));
  43. 43 } catch (Exception e) {
  44. 44 throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
  45. 45 }
  46. 46 }
  47. 47 }

通过以上源码,我们就能看出,在mybatis的配置文件中:

  1. configuration节点为根节点。
  2. 在configuration节点之下,我们可以配置10个子节点, 分别为:properties、typeAliases、plugins、objectFactory、objectWrapperFactory、settings、environments、databaseIdProvider、typeHandlers、mappers。

本篇文章就先只介绍这些内容,接下来的文章将依次分析解析这个10个节点中比较重要的几个节点的源码,看看在解析这些节点的时候,到底做了些什么。

Mybatis 系列2-配置文件的更多相关文章

  1. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  2. Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html     http://www.cnblogs.com/xdp-gacl/p/4264425.ht ...

  3. 深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete

    上篇文章<深入浅出Mybatis系列(六)---objectFactory.plugins.mappers简介与配置>简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介 ...

  4. 深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置

    上篇文章<深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)>简单看了一下TypeHandler, 本次将结束对于mybatis的配置文件的学习 ...

  5. 深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)>为大家介绍了mybatis中别名的使用,以及其源码.本篇将为大家介绍TypeH ...

  6. 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...

  7. 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根 ...

  8. 深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(一)---Mybatis入门>, 写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们 ...

  9. Mybatis 系列10

    在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程 1. SqlSessionFactory 与 SqlSession. 通过前面的章 ...

  10. Mybatis 系列7

    上篇系列6中 简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介绍mapper映射文件的配置. 这是mybatis的核心之一 一定要学好 在mapper文件中,以mapper作为根 ...

随机推荐

  1. 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 ...

  2. 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 ...

  3. unity3d常用组件及分析

  4. 谈谈 在 .Net 生态里为什么没有 Hadoop 系列 ?

    在 .Net 生态里为什么没有 Hadoop 系列  ? 有需要 有 Hadoop 系列 吗  ?

  5. nginx下js文件修改后访问不更新问题解决

    今天遇到一个问题,nginx下js修改后不更新,加版本号,刷新浏览器缓存都不行,重启服务器才行,修改后又不更新了而且加载的js文件会有乱码或者文件加载不全的问题. 解决办法:修改nginx.conf, ...

  6. jmeter—JDBC request动态参数设置

    jmeter—JDBC request动态参数设置 重要参数说明: Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable ...

  7. python获取代理IP并测试是否可用

    # coding: utf-8 import urllib2 import re import time def getDL(page): url = 'http://www.xicidaili.co ...

  8. #ifdef __cplusplus extern "C" { #endif 含义

    转载! 1.在好多程序中我们会遇到下面代码段 #ifdef __cplusplus         extern "C" {         #endif //c语法代码段 #if ...

  9. IntelliJ IDEA maven项目 ***

    创建一个新Maven项目 new 一个project 不选择任何Maven模板 起个GroupId.ArifactId 起个项目名.注意:Idea_Project是存放此项目的工作区间,mavenDe ...

  10. navigator 判断移动端是Android还是iOS

    let u = navigator.userAgent; let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...