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 ...
随机推荐
- java linux ImageIO 验证码在一段时间以后出不来 问题总结
最近在测试上布署的项目经常性的出现验证码过了一段时间以后出不来的情况,耐心找了一下,最后在上级的指导下发现了报错,其实说真的,我自己也找到了这个报错,只是没有当一回事.因为这个验证码的东西不是我写的, ...
- Linux下利用ssh远程文件传输 传输命令 scp
在linux下一般用scp这个命令来通过ssh传输文件. 一.scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进 ...
- Libgdx1.6.2发布,跨平台游戏开发框架
原文地址:www.libgdx.cn [1.6.2] API更改:TiledMapImageLayer位置由整型改为浮点类型. API更改:添加GLFrameBuffer 和 FrameBufferC ...
- iOS 使用AVAudioPlayer开发录音功能
最近要做一个类似对讲的功能,所以需要用到录音上传,然后再播放的功能. 一.音频格式分析 因为之前没研究过音频这块,所以很多音频格式都是第一次见. AAC: AAC其实是"高级音频编码(adv ...
- leetcode 104 Maximum Depth of Binary Tree二叉树求深度
Maximum Depth of Binary Tree Total Accepted: 63668 Total Submissions: 141121 My Submissions Question ...
- 取消选中单选框radio的三种方式
作者: 铁锚 日期: 2013年12月21日 本文提供了三种取消选中radio的方式,代码示例如下: 本文依赖于jQuery,其中第一种,第二种方式是使用jQuery实现的,第三种方式是基于JS和DO ...
- Cocos2D v2.0至v3.x简洁转换指南(三)
Cocos2D 3.3中的注意事项 如果你在使用Cocos2D 3.3+(是SpriteBuilder 1.3+的一部分)你将不得不替分别的换所有存在的UITouch和UITouchEvent为CCT ...
- 网站开发进阶(二十五)js如何将html表格导出为excel文件
js如何将html表格导出为excel文件 赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,共勉! jsp页面数据导出成excel的方法很 ...
- Java进阶(十一)部分数据类型取值范围
java整型byte,short,int,long取值范围大小 在项目开发中,需要用到随机数的生成方法,代码如下: public static String randomizeNumber(int n ...
- Ext JS添加子组件的误区
经常会有人问我,为什么我的Grid不能岁窗口的变得而自动调整.了解后,发现很多人都习惯在渲染子组件的时候将Gird渲染到容器内的一个div里,而这正是问题的所在. 在Ext JS的布局系统中,能控制到 ...