【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源码片段:

 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的配置文件中:

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

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

Mybatis 系列2的更多相关文章

  1. 深入浅出Mybatis系列(九)---强大的动态SQL

    上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.resultMap>简单介绍了mybatis的查询,至此,CRUD都已讲完.本文将介绍mybatis ...

  2. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  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系列之四:关联数据的查询

    myBatis系列之三:增删改查是基于单表的查询,如果联表查询,返回的是复合对象,需要用association关键字来处理. 如User发表Article,每个用户可以发表多个Article,他们之间 ...

  10. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

随机推荐

  1. 高性能nosql ledisdb设计与实现(1)

    ledisdb是一个用go实现的基于leveldb的高性能nosql数据库,它提供多种数据结构的支持,网络交互协议参考redis,你可以很方便的将其作为redis的替代品,用来存储大于内存容量的数据( ...

  2. 【一天一道LeetCode】#109. Convert Sorted List to Binary Search Tree

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  3. Mybatis执行ReuseExecutor(五)

    ReuseExecutor顾名思义就是重复使用执行,其定义了一个Map<String, Statement>,将执行的sql作为key,将执行的Statement作为value保存,这样执 ...

  4. 采购申请 POCIRM-001:ORA-01403: 未找到任何数据

    今天同事让帮忙看一个问题,在销售模块提交销售订单生成采购订单的请求时报错 查看请求日志 +------------------------------------------------------- ...

  5. 我也来写spring

    本文可作为北京尚学堂 spring课程的学习笔记 我们还是用上一篇文章的例子 给数据库中增加一个user 整体代码如下 package com.bjsxt.test; import com.bjsxt ...

  6. 从JDK源码角度看java并发的公平性

    JAVA为简化开发者开发提供了很多并发的工具,包括各种同步器,有了JDK我们只要学会简单使用类API即可.但这并不意味着不需要探索其具体的实现机制,本文从JDK源码角度简单讲讲并发时线程竞争的公平性. ...

  7. 12.1、Libgdx的图像之持续性和非持续性渲染

    (官网:www.libgdx.cn) Libgdx在默认情况下,渲染现成调用render()方法进行持续性渲染.频率取决于你的硬件设备. 有时候有些游戏中并不需要持续性的渲染,为了省电,可以关掉持续性 ...

  8. shell的case语句

    case语句格式 # vi test.sh : echo "input : " read num echo "the input data is $num" c ...

  9. C语言通讯录管理系统

    本文转载自:http://blog.csdn.net/hackbuteer1/article/details/6573488 实现了通讯录的录入信息.保存信息.插入.删除.排序.查找.单个显示等功能. ...

  10. 分布式进阶(十五)ZMQ

    我们为什么需要ZMQ 目前的应用程序很多都会包含跨网络的组件,无论是局域网还是因特网.这些程序的开发者都会用到某种消息通信机制.有些人会使用某种消息队列产品,而大多数人则会自己手工来做这些事,使用TC ...