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系列(九)---强大的动态SQL
上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.resultMap>简单介绍了mybatis的查询,至此,CRUD都已讲完.本文将介绍mybatis ...
- 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap
上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...
- 深入浅出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系列之四:关联数据的查询
myBatis系列之三:增删改查是基于单表的查询,如果联表查询,返回的是复合对象,需要用association关键字来处理. 如User发表Article,每个用户可以发表多个Article,他们之间 ...
- 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good
上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...
随机推荐
- 【linux学习笔记】Sublime Text3支持GB2312和GBK编码以及中文输入法
几天在ubuntu15.10下使用Sublime Text3发现中文乱码,以及不能使用中文输入法(搜狗输入法linux版)的问题,捣鼓了半天,终于完善了,下面po一下我的解决方案. 一.支持GB231 ...
- java虚拟机构造原理
Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机. ...
- Uva - 210 - Concurrency Simulator
自己写个双端队列,或者直接用deque,这个也比较好用 AC代码: #include <iostream> #include <cstdio> #include <cst ...
- Cocos2D:塔防游戏制作之旅(十八)
在Enemy.m的getDamaged:方法只给你添加如下1行(在if条件内): [theGame awardGold:200]; 现在运行游戏你将注意到你不能放置超出你资源金币的炮塔了.当然杀死敌人 ...
- Torch的安装和学习
Long long ago, 就已经安装好Torch,这里再记录一下.Torch是Facebook开发的用于AI的科学计算框架,可广泛运用于机器学习的很多算法.相比Caffe,其接口运用更加方便,使用 ...
- 【shell脚本练习】网卡信息和简单日志分析
题目 1.写一个脚本getinterface.sh,脚本可以接受参数(i,I,a),完成以下任务: (1)使用以下形式:getinterface.sh [-i interface|-I IP|-a] ...
- 算法面试题-leetcode学习之旅(二)
题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...
- 【Qt编程】Qt学习之窗口间的相互切换
在用Qt设计GUI时,经常要设计两个窗口之间的相互切换,即可以从一个窗口跳转到另一个窗口,然后又从另一个窗口跳转回原窗口.下面我们来介绍具体的实现方法: 工程建立及功能描述: 首先,我们建立Qt G ...
- 中国象棋游戏Chess(2) - 走棋
之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制 现在实现走棋的功能. 首先需要获取点击到的棋子,用QWidget中的函数 mouseReleaseEvent 实现函数: vo ...
- OpenGL Shader Key Points (2)
1. Uniform 1.1. Uniform变量 不是所有的变量都是跟顶点一一对应的,如变换矩阵,光源位置等. Uniform变量可以在任何类型的shader中使用,但只能作为输入值,不能在sh ...