Mybatis 系列2-配置文件

【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个节点中比较重要的几个节点的源码,看看在解析这些节点的时候,到底做了些什么。

 

转载于:https://www.cnblogs.com/yizhiamumu/p/8996833.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中restful接口开发实例_Python RESTful接口开发02

什么是RESTfulRESTful是一种设计思想,一种风格。RESTful主要包括 资源 和 对资源的操作。资源: 对实体的抽象,图书、音乐、电影、学生等都属于资源。对资源的操作: HTTP 方法 行为 示例 GET 获取资源的信息 http://example.com/…

Storm环境搭建(分布式集群)

作为流计算的开篇,笔者首先给出storm的安装和部署,storm的第二篇,笔者将详细的介绍storm的工作原理。下边直接上干货,跟笔者的步伐一块儿安装storm。 原文链接:Storm环境搭建(分布式集群) Step1…

php 红包算法,PHP语言:实现微信红包拆分算法

本文主要向大家介绍了PHP语言:实现微信红包拆分算法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助。 修复最后一个红包输出未保留2位数 修复领取的红包金额低于最小红包限制* 红包分配算法** example* $coupon new Coupon(…

java 强制向上转型,Java 转型(向上或向下转型)详解及简单实例

在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。向上转型我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念…

复习Python DB-API

一、python的DB-API 1.Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同 的方式操作各数据库。 Python DB-API使用流程: 1. 引入API模块。 2. 获取与数据库的连接。 3. 执行SQL语句和存储过程。 4. 关闭数据库连接。 2.Python操作mysql 安装包&am…

java se程序设计课后答案,JAVA SE程序设计及实践

实践3 类与对象实践3.4修改Menu类,增加显示普通员工、经理、管理员对应的功能菜单的方法。package com.dh.hrmanager.util;import java.util.Scanner;public class Menu {/*** 返回登陆菜单*/public void showLoginMenu() {System.out.println("\n\n\t\t欢迎进…

个人空间风格模版php,home.php这个页面风格模板在哪里修改?答案:space_home.html...

/template/default/home 空间模块模板目录editor_image_menu.htmfollow_feed.htm 广播首页follow_feed_li.htm 广播数据列表follow_user_header.htm 广播用户数据统计invite.htm 邀请模板magic_call.htm 道具-点名卡magic_detector.htm 道具-探测器magic_doodle.htm 道…

18.QT-QPlainEdit 信号与槽

QPlainEdit编辑功能 Public Slots void appendHtml ( const QString & html ) void appendPlainText ( const QString & text ) void centerCursor () void clear () void copy () void cut () void insertPlainText ( const QString & text ) void paste () void …

VS生成Cordova for Android应用之Gradle

VS生成Cordova for Android应用之Gradle 原文:VS生成Cordova for Android应用之Gradle一、Gradle简介 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。 …

进一法整数php,进一法取整、四舍五入取整、忽略小数等的取整数方法大全

PHP取整数函数常用的四种方法,下面收集了四个函数;经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已~~主要是:ceil,floor,round,intvalPH…

pjax转发

pjax几大特点: 1、异步(ajax) 2、地址栏改变路径 3、实现前进和后退back和forword 如何解决:地址变了之后,万一F5刷新的问题,主要是通过后台判断是否为pjax请求,是的话做个标志,在前…

php全局cors,PHP开启CORS - slagga的个人页面 - OSCHINA - 中文开源技术交流社区

php后台响应头部代码//json头header("Content-type: application/json");//跨域header("Access-Control-Allow-Credentials: true");header("Access-Control-Allow-Origin: 跨域URL");//CORSheader("Access-Control-Request-Methods:GET, P…

嘻嘻

今天我们来聊一下如何减肥? 其实我也不知道,嘻嘻~ 开个玩笑 好了,今天我们继续来学习新的知识。 在前两篇文章中,我们接触到了索引的概念,今天我们要对索引进行一个拓展。首先我们先来看一下下面这段代码: …

mysql :完整性约束

---恢复内容开始--- 一:介绍 约束条件与数据类型的宽度一样 ,都是可选参数 作用,用于保证数据的完整性和 一致性 主要分为: primary key (pk) 标识该字段为该表的主键, 可以唯一的标识记录 foreign key (fk…

php htts cookies,Http和Https下的cookie的写入问题

session和cookie是不一样的session存储在服务器,cookie存储在客户端设置cookie:function setcookie ($name, $value null, $expire null, $path null, $domain null, $secure null, $httponly null) {}获取cookie:$_COOKIE[$sCookieName];题主的写法只是操作了服务器端的…

断言NSAssert的使用

NSAssert()的定义是 #define NSAssert(condition, desc) condition是条件表达式,值为yes或者no,在OC中规定0为假,非0就为真。 desc为异常描述,为NSString类型。 当condition为yes时程序继续运行; 当condition为no时程序…

五维图matlab,五维立体图,怎么画五维图(即以五边形反映各项水平)

一维、二维、三维、四维、五维分别是什么?线是一维的,参数是点 面是二维的,参数是线 体是三维的,参数是面 以此类推,以体为参数构成的空间就是四维空间,通常理解为时间,从很多科幻小说中可以看到…

java 做项目踩坑,web项目踩坑过程

sql函数设计:一开始本来是直接用Java的jdbc直接传输操作语句的。但后来学了存储过程发现存储过程可以提高不少的效率。就重构了自己对数据库的操作代码。包括:开启,查找,修改,关闭。开启:直接使用的构造函数…

python中主函数循环,带有菜单函数的Python主函数循环不起作用?

我现在是一名大学生,正在上python课程。我们的任务是用函数创建这个程序。main函数调用菜单,然后在main函数中编写一个循环,根据菜单函数中的用户响应访问其他函数。在我好像不能让我的循环工作。当我选择一个菜单选项时,什么都不…

在nocdb转pdb的时候遇到小bug

在nocdb转为pdb之后,发现有一个应用账号。从pdb使用expdp导出。导入其他nocdb。报错ORA-01917: user or role HUE does not exist[oraclelxtrac06 ~]$ more 1HUE.log ;;; Import: Release 12.2.0.1.0 - Production on Wed May 9 23:20:59 2018Copyright (c) 1982, 2…