MyBatis源码解析之加载 mybatis-config

news/2024/11/30 9:55:35/

概述

在 MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息(包括属性配置、别名配置、拦截器配置、环境(数据源和事 务管理器)、Mapper配置等),解析后的配置信息会形成相应的对象并保存到 Configuration 对象中

mybatis简单的使用例子如下:

String resource = "mybatis-config.xml";Reader reader;try {//将XML配置文件构建为Configuration配置类reader = Resources.getResourceAsReader(resource);// 通过加载配置文件流构建一个SqlSessionFactory  DefaultSqlSessionFactorySqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);// 数据源 执行器  DefaultSqlSessionSqlSession session = sqlMapper.openSession();try {// 执行查询 底层执行jdbc//User user = (User)session.selectOne("com.tuling.mapper.selectById", 1);UserMapper mapper = session.getMapper(UserMapper.class);System.out.println(mapper.getClass());User user = mapper.selectById(1L);System.out.println(user.getUserName());} catch (Exception e) {e.printStackTrace();}finally {session.close();}} catch (IOException e) {e.printStackTrace();}}
}

源码解析

可以看到mybatis初始化流程入口是 SqlSessionFactoryBuilder 类
org.apache.ibatis.session.SqlSessionFactoryBuilder#build(java.io.InputStream, java.lang.String, java.util.Properties)

 public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {//创建 XMLConfigBuilder 对象XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);// 执行 XML 解析// 创建 DefaultSqlSessionFactory 对象return build(parser.parse());} catch (Exception e) {throw ExceptionFactory.wrapException("Error building SqlSession.", e);} finally {ErrorContext.instance().reset();try {inputStream.close();} catch (IOException e) {// Intentionally ignore. Prefer previous error.}}}

创建 XMLConfigBuilder 对象。
调用 XMLConfigBuilder#parse() 方法,执行 XML 解析,返回 Configuration 对象。
创建 DefaultSqlSessionFactory 对象。

构造方法

private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {// 创建 Configuration 对象super(new Configuration());ErrorContext.instance().resource("SQL Mapper Configuration");//  设置 Configuration 的 variables 属性this.configuration.setVariables(props);this.parsed = false;this.environment = environment;this.parser = parser;
}

XMLConfigBuilder#parse

org.apache.ibatis.builder.xml.XMLConfigBuilder#parse方法

public Configuration parse() {// 若已解析,抛出 BuilderException 异常if (parsed) {throw new BuilderException("Each XMLConfigBuilder can only be used once.");}//  标记已解析parsed = true;//解析 XML configuration 节点parseConfiguration(parser.evalNode("/configuration"));return configuration;
}

parseConfiguration

org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration

private void parseConfiguration(XNode root) {try {//issue #117 read properties first// <1> 解析 <properties /> 标签propertiesElement(root.evalNode("properties"));// <2> 解析 <settings /> 标签Properties settings = settingsAsProperties(root.evalNode("settings"));// <3> 加载自定义 VFS 实现类loadCustomVfs(settings);// <4> 解析 <typeAliases /> 标签typeAliasesElement(root.evalNode("typeAliases"));// <5> 解析 <plugins /> 标签pluginElement(root.evalNode("plugins"));// <6> 解析 <objectFactory /> 标签objectFactoryElement(root.evalNode("objectFactory"));// <7> 解析 <objectWrapperFactory /> 标签objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));// <8> 解析 <reflectorFactory /> 标签reflectorFactoryElement(root.evalNode("reflectorFactory"));// <9> 赋值 <settings /> 到 Configuration 属性settingsElement(settings);// read it after objectFactory and objectWrapperFactory issue #631// <10> 解析 <environments /> 标签environmentsElement(root.evalNode("environments"));// <11> 解析 <databaseIdProvider /> 标签databaseIdProviderElement(root.evalNode("databaseIdProvider"));// <12> 解析 <typeHandlers /> 标签typeHandlerElement(root.evalNode("typeHandlers"));// <13> 解析 <mappers /> 标签mapperElement(root.evalNode("mappers"));} catch (Exception e) {throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);}
}

mapperElement方法里边会载 Mapper 映射配置文件

下一篇解析:Mapper 映射配置文件


http://www.ppmy.cn/news/682482.html

相关文章

0x80004005错误代码解决方法_lol手游100014是什么意思 错误代码100014解决方法[多图] -手游问答...

LOL手游100014这个错误该如何解决&#xff0c;同时代码的具体含义是什么呢&#xff0c;遇到之后大家该如何操作呢&#xff0c;下面一起来看看具体的攻略内容。 首先提示错误代码100014是说明你网络不佳&#xff0c;需要用加速软件&#xff0c;这个玩家可以自行去应用商店下载。…

fantastical怎么设置中文_英雄联盟手游韩服怎么设置中文 英雄联盟手游韩服设置中文教程_游戏资讯...

英雄联盟手游现在在海外地区已经进行测试了&#xff0c;而国内暂时还没有上线&#xff0c;很多朋友想要抢先体验一下&#xff0c;所以纷纷注册了外服的账号&#xff0c;但是在注册登录之后发现上面的语言看不懂&#xff0c;那应该怎么将语言进行修改呢&#xff1f;相信各位玩家…

无法往开启kerberos的zookeeper上注册服务_英雄联盟手游拳头账号有几个区?lol手游韩国账号怎么注册?...

英雄联盟手游从10月28日正式开启全球范围多服务器的同时公测&#xff0c;本次公测开放了日服、韩服、东南亚服、美服、欧服等地区的服务器&#xff0c;并且账号信息互通&#xff0c;也就是都处于统一的一个拳头账号名下&#xff0c;玩家们能够在各个服务器之间进行切换&#xf…

2021-07-11

初学html的一些基本用法 <html> <head> <meta charset"utf-8"> <title>测试</title> </head><body background"lol.jpeg" style"background-repeat:no-repeat background-attachment:fixed; background-siz…

ourplay插件_ourplay64位辅助包

ourplay64位辅助包是一款可以帮助用户更好的进行游戏的软件,没有这款软件的话很多的游戏都可能玩不了,在OurPlay软件上你可以看到海量的游戏资源和新游推荐,可以给你带来非常好的游戏体验,感兴趣的朋友赶紧下载ourplay64位辅助包开始使用吧! ourplay64位辅助包介绍 OurPlay,一…

riot修改服务器,riot改地区教程

使用riot games的玩家大多都知道&#xff0c;自己的拳头账号无法随意切换地区。相信还有很多小伙伴不是很清楚怎么修改riot拳头账号所在地区&#xff0c;下面小编给大家带来riot改地区教程&#xff0c;感兴趣的小伙伴们一起来看看吧&#xff0c;希望能帮助到你们。 小编推荐&am…

云顶之奕账号服务器的缩写,云顶之弈各服务器上线时间一览

云顶之弈已经在美服PBE测试一段时间了&#xff0c;终于要开始登陆正式服了&#xff0c;下面为大家带来的是lol云顶之弈各服务器的正式上线时间一览&#xff0c;一起来了解一下吧。 云顶之弈各服务器上线时间一览 由于以下的时间都是太平洋时区&#xff0c;需要延后一天算。而为…

lol 哪个服务器稳定,2021英雄联盟推荐新手去哪个服务器

2021英雄联盟推荐新手去哪个服务器&#xff0c;这肯定是各位新手玩家们都想知道的问题&#xff0c;不过也确实如此&#xff0c;国服不和韩服一样&#xff0c;韩服是所有人在一个大区内&#xff0c;而国服则分了很多区&#xff0c;时间一长&#xff0c;每个区的质量也就不一样&a…