03_根据配置文件创建SqlSessionFactory(Configuration的创建过程)
这里写自定义目录标题
- 欢迎使用Markdown编辑器# 系列文章目录
- 前言
- 一、pandas是什么?
- 二、配置文件解析入口
- 1.配置文件解析入口
- 2.文件解析
- 总结
欢迎使用Markdown编辑器# 系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 欢迎使用Markdown编辑器# 系列文章目录
- 前言
- 一、pandas是什么?
- 二、配置文件解析入口
- 1.配置文件解析入口
- 2.文件解析
- 总结
前言
我们使用mybatis操作数据库都是通过SqlSession的API调用,而创建SqlSession是通过SqlSessionFactory。下面我们就看看SqlSessionFactory的创建过程。
一、pandas是什么?
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、配置文件解析入口
1.配置文件解析入口
public static void main(String[] args) throws IOException {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();try {Employee employeeMapper = sqlSession.getMapper(Employee.class);List<Employee> all = employeeMapper.getAll();for (Employee item : all)System.out.println(item);} finally {sqlSession.close();}
}
public SqlSessionFactory build(InputStream inputStream) {// 调用重载方法return build(inputStream, null, null);
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {// 创建配置文件解析器XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);// 调用 parser.parse() 方法解析配置文件,生成 Configuration 对象return build(parser.parse());
}public SqlSessionFactory build(Configuration config) {// 创建 DefaultSqlSessionFactory,将解析配置文件后生成的Configuration传入return new DefaultSqlSessionFactory(config);
}
2.文件解析
public Configuration parse() {if (parsed) {throw new BuilderException("Each XMLConfigBuilder can only be used once.");}parsed = true;parseConfiguration(parser.evalNode("/configuration"));return configuration;}private void parseConfiguration(XNode root) {try {//issue #117 read properties firstpropertiesElement(root.evalNode("properties"));Properties settings = settingsAsProperties(root.evalNode("settings"));loadCustomVfs(settings);typeAliasesElement(root.evalNode("typeAliases"));pluginElement(root.evalNode("plugins"));objectFactoryElement(root.evalNode("objectFactory"));objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));reflectorFactoryElement(root.evalNode("reflectorFactory"));settingsElement(settings);// read it after objectFactory and objectWrapperFactory issue #631environmentsElement(root.evalNode("environments"));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);}}
# 我们目录只看这两个配置文件解析environmentsElement(root.evalNode("environments"));mapperElement(root.evalNode("mappers"));# 解析后set到configuration中private void environmentsElement(XNode context) throws Exception {if (context != null) {if (environment == null) {environment = context.getStringAttribute("default");}for (XNode child : context.getChildren()) {String id = child.getStringAttribute("id");if (isSpecifiedEnvironment(id)) {TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));DataSource dataSource = dsFactory.getDataSource();Environment.Builder environmentBuilder = new Environment.Builder(id).transactionFactory(txFactory).dataSource(dataSource);configuration.setEnvironment(environmentBuilder.build());}}}}
private void mapperElement(XNode parent) throws Exception {if (parent != null) {for (XNode child : parent.getChildren()) {if ("package".equals(child.getName())) {String mapperPackage = child.getStringAttribute("name");configuration.addMappers(mapperPackage);} else {String resource = child.getStringAttribute("resource");String url = child.getStringAttribute("url");String mapperClass = child.getStringAttribute("class");if (resource != null && url == null && mapperClass == null) {ErrorContext.instance().resource(resource);InputStream inputStream = Resources.getResourceAsStream(resource);XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());mapperParser.parse();} else if (resource == null && url != null && mapperClass == null) {ErrorContext.instance().resource(url);InputStream inputStream = Resources.getUrlAsStream(url);XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());mapperParser.parse();} else if (resource == null && url == null && mapperClass != null) {Class<?> mapperInterface = Resources.classForName(mapperClass);configuration.addMapper(mapperInterface);} else {throw new BuilderException("A mapper element may only specify a url, resource or class, but not more than one.");}}}}}
总结
03_根据配置文件创建SqlSessionFactory(Configuration的创建过程)相关推荐
- Mybatis源码分析之(二)根据配置文件创建SqlSessionFactory(Configuration的创建过程)
SqlSessionFactoryBuilder.build创建SqlSessionFactory(粗略走一步流程) 看完上篇文章后,你对mybatis应该有个大概的了解了,那么我们知道new Sql ...
- MyBatis 核心配置综述之 Configuration详解
颓废青年,快出来挨打! 点击上方"Java极客技术",选择"设为星标" 后台回复"java",获取Java知识体系/面试必看资料 资料会持续 ...
- 【USB笔记】配置描述符Configuration Descriptor
USB笔记 配置描述符(Configuration Descriptor) 配置描述符(Configuration Descriptor)说明了一个特定配置的相关信息.取得设备描述符(Device D ...
- [SpringBoot2]容器功能_底层注解配置绑定_@Configuration@Import@Conditional@ImportResource
@Configuration&@Bean 告诉SpringBoot这是一个配置类==配置文件 #############################Configuration使用示例### ...
- linux kvm dhcp配置,《转》QEMU-KVM创建虚拟机自动指定IP的配置
在使用qemu创建虚拟机的过程中是无法指定IP地址的,可是在实际应用中,我们是需要虚拟机拥有IP地址的,并且不是人为去虚拟机操作系统上配置.在qemu虚拟机技术文档(http://qemu.weiln ...
- Team Foundation Server 2010 安装、部署与配置(七):创建 Team Project 时的一个 Issue:TF218027 .
上文<Team Foundation Server 2010 安装.部署与配置(六):创建 Team Project>中,我在实践过程中其实遇到过一个 issue(TF218027),所幸 ...
- Flowable 6.6.0表单 - 1.配置 - 1.4 数据库配置(Database configuration)
培训视频推荐 CSDN上提供了Flowable 6.6.0的系列培训视频课程,欢迎有兴趣的朋友前往学习. <Flowable流程入门课程> <Flowable流程高级课程> & ...
- 实验5:配置通过静态工厂方法创建的bean、实例工厂方法创建的bean、(FactoryBean测试)★
实验5:配置通过静态工厂方法创建的bean.实例工厂方法创建的bean.(FactoryBean测试)★ bean的创建默认就是框架利用反射new出来的bean实例 工厂模式:工厂帮我们创建对象:有一 ...
- Springboot 配置类( @Configuration) 不能使用@Value注解从application.propertyes中加载值以及Environment为null解决方案
Springboot 配置类( @Configuration) 不能使用@Value注解从application.propertyes中加载值以及Environment为null解决方案 参考文章: ...
最新文章
- 昌平房价已降至6500元每一平米
- IOS-C语言第1天
- Centos 6.7 配置时间同步解决时间自动变化的问题
- 国产计算机设备,小芯机:“天玥”中国第一台纯国产电脑诞生!
- webpack 合并压缩_webpack的运用
- ASP.NET伪静态-无法读取配置文件,因为它超过了最大文件大小的解决办法
- 封装(私有化成员变量,获取变量值)
- LeetCode 671. 二叉树中第二小的节点
- 敏捷测试感悟(之一)
- think in java bruce eckel_java大师 Bruce Eckel 批评java
- angular遇到问题
- 游戏测试成长之路02-测试用例
- Thymeleaf模板引擎使用详解
- kali安装火狐浏览器
- 基于近似计算的同态加密方案CKKS17----实现库介绍
- Android自定义View2--触摸事件传递机制
- 五 、Elasticsearch分词器
- sublimeText3配置sublimeLinter
- java77-GUL下拉菜单框和滚动条
- android6恢复桌面,安卓手机桌面日期和天气误删除的恢复方法
热门文章
- 【网络安全】MS17-010“永恒之蓝”漏洞的利用
- PHP面试基础题之一
- mblock机器人指令_mBot机器人如何通过蓝牙实现与PC端mBlock的无线通信?
- oracle sql子串替换,【总结】Oracle sql 中的字符(串)替换与转换
- DCT离散余弦变换(C语言)
- CStdioFile 在文件末尾追加内容
- GD32F4上使用HAL库实现USB虚拟串口通讯
- oracle 00600 kccpb,惜分飞 - 提供7*24专业数据库(Oracle,SQL Server,MySQL等)恢复和Oracle技术服务@Tel:+86 13429648788...
- 图神经网络(十八)GEOM-GCN: GEOMETRIC GRAPH CONVOLUTIONAL NETWORKS
- codesmith 7.0 破解