Mybatis源码学习笔记(二) 配置介绍
来源:互联网 发布:淘宝介入是什么意思 编辑:程序博客网 时间:2024/06/06 02:23
配置介绍
在上篇文章的例子中,我们可以看到,Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互。
所以我们要知道如何构建SqlSessionFactory的,通过下面这段代码可以知道,是通过SqlSessionFactoryBuilder的build方法构建的。那么,先从SqlSessionFactoryBuilder入手:
// Reader读取mybatis配置文件,传入构造方法 而这里的Reader就是Resources.getResourceAsReader(resource)方法返回的// 除了Reader外,其实还有对应的inputStream作为参数的构造方法 就在这段源码的下方 这里暂时先不贴了public SqlSessionFactory build(Reader reader) { return build(reader, null, null); } public SqlSessionFactory build(Reader reader, String environment) { return build(reader, environment, null); }// mybatis配置文件 + properties, 此时mybatis配置文件中可以不配置properties,也能使用${}形式 public SqlSessionFactory build(Reader reader, Properties properties) { return build(reader, null, properties); } public SqlSessionFactory build(Reader reader, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties); //XMLConfigBuilder 通过parse方法 来解析configuration.xml文件 return build(parser.parse()); } catch (Exception e) { throw ExceptionFactory.wrapException("Error building SqlSession.", e); } finally { ErrorContext.instance().reset(); try { reader.close(); } catch (IOException e) { // Intentionally ignore. Prefer previous error. } } }
二、XMLConfigBuilder 类:
// 构建一个 XMLConfigBuilder对象 //这里通过传入一个reader 是否进行验证的布尔值 Properties对象 XMLMapperEntityResolver对象(用来找到对应的dtd文件) 来构造一个XML解析器 XPathParser // 这个解析器中 // private Document document; 用来解析xml文件 // private boolean validation; 验证 // private EntityResolver entityResolver; 通过key查找dtd文件 // private Properties variables; // private XPath xpath; 将元素转换成为节点信息 // URL和mybatis的dtd文件用map做了一个映射,每个配置文件中有一个PUBLICID和SYSTEMID 这个是我们注册的key 而EntityResolver是一个接口 实现这个接口可以去寻找dtd文件 public XMLConfigBuilder(Reader reader, String environment, Properties props) { this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props); } // 对解析器XPathParser environment Properties 对象进行初始化 private XMLConfigBuilder(XPathParser parser, String environment, Properties props) { super(new Configuration()); ErrorContext.instance().resource("SQL Mapper Configuration"); // 将已配置的Properties属性set到Configuration对象中 // configuration这个对象会装载所有解析mybatis配置文件的所有节点元素 this.configuration.setVariables(props); this.parsed = false; this.environment = environment; this.parser = parser; } public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; //从根节点 configuration 入手解析 parseConfiguration(parser.evalNode("/configuration")); return configuration; } //从源码中可以看出 configuration节点为根节点 // 在configuration节点之下,我们可以配置10个子节点, 分别为:properties、typeAliases、plugins、objectFactory、objectWrapperFactory、settings、environments、databaseIdProvider、typeHandlers、mappers private void parseConfiguration(XNode root) { try { propertiesElement(root.evalNode("properties")); //issue #117 read properties first typeAliasesElement(root.evalNode("typeAliases")); pluginElement(root.evalNode("plugins")); objectFactoryElement(root.evalNode("objectFactory")); objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); settingsElement(root.evalNode("settings")); environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631 databaseIdProviderElement(root.evalNode("databaseIdProvider")); typeHandlerElement(root.evalNode("typeHandlers")); mapperElement(root.evalNode("mappers")); } catch (Exception e) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e); } }
阅读全文
1 0
- Mybatis源码学习笔记(二) 配置介绍
- J2EE系列之MyBatis学习笔记(二)-- mybatis配置
- Mybatis源码学习笔记(四) 配置详解之typeAliases
- Mybatis源码学习笔记(五)配置简介之TypeHandler
- MyBatis学习笔记(二)--配置环境详解
- Mybatis学习笔记之三:Mybatis的常用配置介绍
- mybatis学习笔记(二)
- Mybatis学习笔记(二)
- Mybatis学习笔记(二)
- MyBatis学习笔记(二)
- MyBatis学习笔记(二)
- MyBatis学习笔记(二)
- MyBatis学习笔记(二)
- mybatis学习笔记-介绍
- Mybatis源码学习(二)annotation包
- MyBatis学习笔记(二)优化MyBatis配置,解耦合,提高复用性
- MyBatis学习笔记二
- myBatis学习笔记(二)
- 根据宝宝生日返回当前宝宝年龄
- xcode8.2.1支持iOS8.3.1系统 添加设备依赖库文件
- hibernate学习之核心api
- neo4j 的使用说明(三)
- PhpStorm 配置在浏览器中打开PHP文件
- Mybatis源码学习笔记(二) 配置介绍
- [POJ1390]Blocks(方块消除)
- 把内存中的数据转化成16进制显示
- Web Storage 本地存储sessionStorage
- OpenCV学习笔记(20)关于opencv新版本中rows和cols的理解
- 简单进度条插件JS
- linux du命令用法
- 对称的二叉树(Java实现)
- Spring之二,基础深入,理解动态代理