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 ...
随机推荐
- 物料事务处理interface与temp解析
MTL_TRANSACTIONS_INTERFACE MTL_TRANSACTIONS_INTERFACE is the interface point between non– Inventory ...
- Java中Integer和String浅谈
Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...
- AnimatedPathView实现自定义图片标签
老早用过小红书app,对于他们客户端笔记这块的设计非常喜欢,恰好去年在小红书的竞争对手公司,公司基于产品的考虑和产品的发展,也需要将app社交化,于是在社区分享这块多多少少参照了小红书的设计,这里面就 ...
- Java中常用的正则表达式
常用的正则表达式 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] 匹配空行的正则表达式:\n[\s| ]*\r 匹配HTML标记的 ...
- javascript之BOM浏览器对象模型引入
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C++ Primer 有感(复制控制)
1.不管类是否定义了自己的析构函数,编译器都 自动执行类中非static数据成员的析构函数. 2.如果我们没有定义复制构造函数,编译器就会为我们合成一个.合成复制构造函数的行为是,执行逐个成员初始化, ...
- 阿里云服务器实战(一) : 在Linux下Tomcat7下使用连接池
云服务器 的环境如下: Tomcat7+MySql5.6 一,如果自定义了程序的文件目录 , 下面的/alidata/xxx 就是自定义的目录 在Linux的Tomcat的server.xml里的Ho ...
- jsp中的路径与跳转
在jsp(serlvet)中,页面的"变换"有两种方式,第一重定向,第二转发: 先说重定向,它的调用方式是这样的 response.sendredirect("uri&q ...
- Material Design之NavigationView和DrawerLayout实现侧滑菜单栏
本文将介绍使用Google最新推出规范式设计中的NavigationView和DrawerLayout结合实现侧滑菜单栏效果,NavigationView是android-support-design ...
- STL常用排序算法介绍
merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. #include <iostream> #include <cstdi ...