网站流量多少做网盟工程招标平台

news/2025/10/6 19:32:34/文章来源:
网站流量多少做网盟,工程招标平台,网站建设全视频教程下载,网站建设交易SqlSessionFactoryBuilder.build创建SqlSessionFactory#xff08;粗略走一步流程#xff09; 看完上篇文章后#xff0c;你对mybatis应该有个大概的了解了#xff0c;那么我们知道new SqlSessionFactoryBuilder().build是框架的入口#xff0c;我们到SqlSessionFactoryB…SqlSessionFactoryBuilder.build创建SqlSessionFactory粗略走一步流程 看完上篇文章后你对mybatis应该有个大概的了解了那么我们知道new SqlSessionFactoryBuilder().build是框架的入口我们到SqlSessionFactoryBuilder类里看到里面其实都是build函数的。 全都是build重载函数。上面几个重载其实最终都是调用了build(Reader reader, String environment, Properties properties)这个方法。下面的几个则是调用了build(InputStream inputStream, String environment, Properties properties) 。 最终都会调用最后一个build(Configuration config)方法把创建好的Configuration赋给DefaultSqlSessionFactory里面的Configuration字段所以这里的逻辑其实非常简单就是解析传入配置文件的Reader或者inputStream然后生成Configuration赋值给新建出来的DefaultSqlSessionFactor中的configuration字段然后返回DefaultSqlSessionFactor。 public class SqlSessionFactoryBuilder {public SqlSessionFactory build(Reader reader) {return build(reader, null, null);}public SqlSessionFactory build(Reader reader, String environment) {return build(reader, environment, null);}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);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.}}}public SqlSessionFactory build(InputStream inputStream) {return build(inputStream, null, null);}public SqlSessionFactory build(InputStream inputStream, String environment) {return build(inputStream, environment, null);}public SqlSessionFactory build(InputStream inputStream, Properties properties) {return build(inputStream, null, properties);}public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {XMLConfigBuilder parser new XMLConfigBuilder(inputStream, environment, properties);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.}}}public SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);}}下面我们来完整的走一个流程就以上一篇的demo为例 //第一步public static SqlSession getSqlsession(){//获取mybatisconfig的xml文件的输入流InputStream config MybatisUtil.class.getClassLoader().getResourceAsStream(mybatis.cfg.xml);//使用SqlSessionFactory build(InputStream inputStream)来获取SqlSessionFactorySqlSessionFactory build new SqlSessionFactoryBuilder().build(config);return build.openSession();}//第二步调用SqlSessionFactoryBuilder中的build(InputStream inputStream)方法public SqlSessionFactory build(InputStream inputStream) {return build(inputStream, null, null);}//第三部调用SqlSessionFactoryBuilder中的build(InputStream inputStream, String environment, Properties properties)方法public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {//把输入流解析成可以用做分析的document以及准备其他解析需要的东西XMLConfigBuilder parser new XMLConfigBuilder(inputStream, environment, properties);//parser.parse()生成出Configuration类最后调用build(Configuration config)方法来生成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.}}}//第四步调用SqlSessionFactoryBuilder中的 build(Configuration config) 方法public SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);}这是最上面的一层逻辑还是非常简单的一句话就能概括就是从给定的配置文件中解析出Configuration然后生成DefaultSqlSessionFactory。如果要指定环境和特定的属性的话用另外2个build 的重载方法 我们先进入最后一个build看一下new DefaultSqlSessionFactory(config);究竟做了什么。 public class DefaultSqlSessionFactory implements SqlSessionFactory {private final Configuration configuration;public DefaultSqlSessionFactory(Configuration configuration) {//非常简单就是生成了一个DefaultSqlSessionFactory 类然后把里面的configuration字段赋值为传入的configuration。this.configuration configuration;}//后面的函数就不列出来了}build是如何通过xml文件来生成Configuration的比较详细的分析流程 所以build的重点在解析xml成Configuration 类这个地方。 也就是下面这两句话 XMLConfigBuilder parser new XMLConfigBuilder(inputStream, environment, properties);parser.parse();ok第一句话是生成了一个XMLConfigBuilder类我们来看看XMLConfigBuilder到底是什么样的。只列出字段和关键方法 public class XMLConfigBuilder extends BaseBuilder {private boolean parsed;private XPathParser parser;private String environment;private ReflectorFactory localReflectorFactory new DefaultReflectorFactory();//上层调用到这个方法然后他调用到了下面的重载方法public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {//这里只有new XPathParser(inputStream, true, props, new XMLMapperEntityResolver())需要看一下this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);}//其实就是给关键的几个字段赋值这里的第一句调用了父类的构造函数传入了一个新的Configuration也就是说到这步的时候我们用来返回的Configuration对象已经有了但是Configuration的值还没有构造好。private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {super(new Configuration());ErrorContext.instance().resource(SQL Mapper Configuration);this.configuration.setVariables(props);this.parsed false;this.environment environment;this.parser parser;}}public abstract class BaseBuilder {protected final Configuration configuration;protected final TypeAliasRegistry typeAliasRegistry;protected final TypeHandlerRegistry typeHandlerRegistry;}接下来我们来看看XPathParser类 public class XPathParser {private Document document;private boolean validation;private EntityResolver entityResolver;private Properties variables;private XPath xpath;public XPathParser(InputStream inputStream, boolean validation, Properties variables, EntityResolver entityResolver) {//为类的其他字段赋值commonConstructor(validation, variables, entityResolver);//根据输入流创建一个Document 并赋值给 document字段之后的解析就靠这里面的信息了this.document createDocument(new InputSource(inputStream));}}xml解析成Document的具体过程LZ就不带大家深入研究了有兴趣的朋友可以自己跟下去看看。 接下来我们回到SqlSessionFactoryBuilder类。 public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {//现在我们已经拿到parser了XMLConfigBuilder parser new XMLConfigBuilder(inputStream, environment, properties);//接下来要去看parse()是怎么创建出Configuration的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.}}}public Configuration parse() {if (parsed) {throw new BuilderException(Each XMLConfigBuilder can only be used once.);}parsed true;//解析靠这步首先拿到configuration节点parseConfiguration(parser.evalNode(/configuration));return configuration;}public XNode evalNode(String expression) {return evalNode(document, expression);}public XNode evalNode(Object root, String expression) {//拿到configuration节点Node node (Node) evaluate(expression, root, XPathConstants.NODE);if (node null) {return null;}//返回封装成XNode类return new XNode(this, node, variables);} public class XNode {private Node node;private String name;private String body;private Properties attributes;private Properties variables;private XPathParser xpathParser;public XNode(XPathParser xpathParser, Node node, Properties variables) {this.xpathParser xpathParser;this.node node;this.name node.getNodeName();this.variables variables;this.attributes parseAttributes(node);this.body parseBody(node);} }XPathParser类的实际值 封装好的Xnode的实际值 //接下来就要解析并给configuration赋值拉。因为configuration在新建XMLConfigBuilder的时候就已经创建好了解析的过程其实就是赋值的过程我们在xml文件里配置的各个节点都在下面这个函数里解析 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);}}这是xml文件中要的标签和上面代码一对比你就会清楚的明白上面每一个方法其实就是把每一个标签转换成configuration。 private void propertiesElement(XNode context) throws Exception {if (context ! null) {//从子属性直接获取属性的键值对Properties defaults context.getChildrenAsProperties();//从外部引入属性文件其实就是获取resource属性的值String resource context.getStringAttribute(resource);//也可以从url下获取属性文件引入网络路径或者磁盘路径下的资源String url context.getStringAttribute(url);if (resource ! null url ! null) {throw new BuilderException(The properties element cannot specify both a URL and a resource based property file reference. Please specify one or the other.);}//从resource 或者 url的属性文件中加载键值对若和上面的defaults键相同则替换defaults中的if (resource ! null) {defaults.putAll(Resources.getResourceAsProperties(resource));} else if (url ! null) {defaults.putAll(Resources.getUrlAsProperties(url));}Properties vars configuration.getVariables();if (vars ! null) {defaults.putAll(vars);}//设置parser的Variablesparser.setVariables(defaults);//设置configuration的Variablesconfiguration.setVariables(defaults);}} 其他的解析其实和properties的解析差不多。根据配置文件节点的信息设置configuration。 因为mybatis非常重要的一个点就是在mapper上所以楼主之后会有一篇专门写mapper是什么解析和使用的。所以这里大家可以简单过一下mapper的解析过程。 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) { //根据resource解析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) {//根据url 解析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) {//根据mapperClass解析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.);}}}}}套路其实差不多就不细细的深入看了。但是mybatis的mapper的实现方法还是要细细讨论的让我们在之后的文章中在细致的学习以下。 小结 看了加载过程的源码我们在这至少了解到了mybatis是如何解析xml文件的还有properties假如我们即在xml文件中直接配置的属性和又设置了resource或者url的话resource或者url中的属性会覆盖xml文件中直接配的key相同的情况下才会覆盖否则是累加的情况若详细看过mapper的创建过程的话还会知道在xml中配的mapper的语句会被注解中配置的语句覆盖。为什么会有这些特性因为源码的读取步骤以及策略如此所以要善于利用

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

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

相关文章

基于Linux环境docker封装exe

基于Linux环境docker封装exepre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

迈向人机价值共生文明:AI元人文范式下的演化架构与协同治理

迈向人机价值共生文明:AI元人文范式下的演化架构与协同治理 引言:超越价值对齐的必然之路 在人工智能发展的当前阶段,我们正面临一个根本性困境:传统“价值对齐”范式试图通过预设规则或优化目标函数将人类价值“灌…

文件存储空间管理

存储空间的划分与初始化 文件卷可以由多个文件磁盘组成 空闲表法 记录了每一个空闲区局的起始地址和结束地址 分配:与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间,同样可以有首次适应,最佳适应,…

ubuntu之开机自启frpc - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:关于ios点击分享自动复制到粘贴板的问题

详细介绍:关于ios点击分享自动复制到粘贴板的问题pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

电子商务网站建设百度文库wordpress获取页面的当前位置

DOS常见命令 DOS是什么如何打开DOScmd常见的命令集合 DOS是什么 DOC命令是我们浏览器中的终端 ,但不同的是我们打开软件的方式 使用的是点击文件图标,点击图标的同时 我们也相当于使用一个命令 只是我们看不见而已 在电脑上操作的时候 通常都是使用命令…

新一代数据平台替代传统大数据技术栈

初创公司Definite获得1000万美元种子轮融资,推出全栈式AI原生数据平台,旨在替代笨重的大数据仓库、连接器和商业智能工具,提供更简单高效的数据分析解决方案。初创公司Definite获资1000万美元,旨在替代笨重大数据技…

攻击者如何绕过macOS内置安全防护机制

本文深入解析macOS核心安全机制(Keychain、SIP、TCC、文件隔离和Gatekeeper)的工作原理,展示攻击者常用的绕过技术,并提供基于Sigma规则的检测方案,帮助提升macOS系统安全防护能力。攻击者如何适应macOS内置防护机…

Python趣学篇:交互式词云生成器(jieba + Tkinter + WordCloud等) - 指南

Python趣学篇:交互式词云生成器(jieba + Tkinter + WordCloud等) - 指南2025-10-06 19:17 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x:…

做图表的网站做新媒体的小说网站

计算机视觉三大国际顶级会议之一的 ECCV 2020 已经召开。今年 ECCV 共收到有效投稿 5025 篇,是 ECCV 2018 论文投稿数量的二倍还要多,接收论文1361 篇,接收率为 27%,相比上届会议下降了约 5%。在接收论文中,oral论文数…

一台主机做两个网站网站建设企业需要准备资料

CORS(Cross-Origin Resource Sharing)"跨域资源共享",是一个W3C标准,它允许浏览器向跨域服务器发送Ajax请求,打破了Ajax只能访问本站内的资源限制,CORS在很多地方都有被使用,微信支付的JS支付就是通过JS向微…

潍坊网站制作发怎么做免费网站教程

mybatis-plus 是一款 Mybatis 动态 SQL 自动注入 Mybatis 增删改查 CRUD 操作中间件, 减少你的开发周期优化动态维护 XML 实体字段,无入侵全方位 ORM 辅助层让您拥有更多时间吃鸡、陪家人、陪朋友。更新日志升级 mybatis 到 3.5.0 版本升级 mybatis-spri…

详细介绍:JVM——从JIT到AOT:JVM编译器的云原生演进之路

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

deep-agents

deep-agents https://docs.langchain.com/labs/deep-agents/overviewhttps://www.bilibili.com/video/BV1ZFYozsEat?spm_id_from=333.788.videopod.sections&vd_source=57e261300f39bf692de396b55bf8c41b https:/…

在A列连续且相等行的最后插入空行,并求和

Sub 第一步插入空行() Set ws = ActiveSheetlastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).RowFor i = lastRow To 3 Step -1If ws.Cells(i, 1).Value <> ws.Cells(i - 1, 1).Value Thenws.Ro…

10.6集训改错

P10312 [SHUPC 2024] 栅栏密码 可以暴力模拟,由于不管怎么变化,在密文中的位置都是不变的所以得到长度之后可以预处理密文在图中的位置,反推得到明文

@Prometheus 监控-MySQL (Mysqld Exporter) - 教程

@Prometheus 监控-MySQL (Mysqld Exporter) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

月熊志网站wordpress当下载站

1-线性回归&#xff08;Linear Regression&#xff09; 场景&#xff1a;预测商品销售额 优点&#xff1a;简单易用&#xff0c;结果易于解释缺点&#xff1a;假设线性关系&#xff0c;容易受到异常值影响概念&#xff1a;建立自变量和因变量之间线性关系的模型。公式&#x…

详细介绍:基于开源AI大模型与AI智能名片的S2B2C商城小程序源码优化:企业成本管理与获客留存的新范式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

服务型网站建设的主题搜索引擎优化通常要注意的问题有( )

目录 概念 区别 概念 宕机和脱机是两个不同的概念 宕机:一般指计算机系统或网络突然停止正常运行&#xff0c;无法继续提供服务。宕机可能是由硬件故障、软件问题、电源中断等原因导致的系统失效。 脱机:通常指设备与网络断开连接或无法直接访问在线资源。例如&#xff0c;…