厦门做商城网站网站宣传册

news/2025/9/23 16:27:30/文章来源:
厦门做商城网站,网站宣传册,企业网站快照更新,cn域名与com域名*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更新 *************************************优雅的分割线 ********************************** SimpleExecutor 前言 笔者大概是从今年的5月份开始喜欢上源码阅读的起初是阅读徐郡明前辈的《Mybatis技术内幕》入的坑不得不说大佬就是大佬书中讲得东西很细很全。半年过去了笔者对mybatis略知一二也开始在为公司搭架构并且基于Mybatis写了一套框架但是尽管如此还是感觉自己对于源码的理解稍微有点浅。好比是初高中学数学吧光看例题不做题是记不住的因此产生了为mybatis写注释的想法想要通过写注释的过程加强对mybatis的理解。虽然现在网上已经有了较全的mybatis中文注释但是感觉还是经过自己手敲更能加强记忆因此便挖下了这个大坑。笔者也希望可以在一年内把这个坑填完后续关于其他技术的文章可能就比较少大多数应该就都是mybatis源码阅读犀利了 在这里附上我的码云地址别问我为什么是码云而不是github下半天代码下不动急死人 mybatis中文注释 同时我也很欢迎更多的初中级开发者投入到阅读源码的行列并且很乐意大家在我的仓库上建立自己的分支希望可以和大家一同进步。 入口 Mybatis 初始化入口文件是SqlSessionFactoryBuilder。该类通过调用XMLConfigBuilder.parse方法初始化配置文件。 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.}}}在XMLConfigBuilder.parse方法中会先校验配置文件是否已经解析过了如果重复解析就抛出异常 public Configuration parse() {if (parsed) {// 已经解析过就不再解析。这里只解析一次throw new BuilderException(每个 XMLConfigBuilder 只能使用一次.);}parsed true;// 获取configuration节点进行解析// mybatis解析配置文件使用的是XPathParser这里的evalNode方法就是解析xml的代码// 这里对XPathParser不进行注释这不属于mybatis的范畴其实是懒。parseConfiguration(parser.evalNode(/configuration));return configuration;}parseConfiguration方法中传入configuration节点配置对mybatis-config.xml文件中的该节点进行解析。解析结果会set到Configuration类中。今天只注释完了properties和settings两个节点的解析 /*** 解析mybatis-config.xml文件** param root*/private void parseConfiguration(XNode root) {try {// 解析properties节点。该节点用来引入外部的资源文件如db.propertiespropertiesElement(root.evalNode(properties));// 解析settings节点校验配置中的配置项是否合法。该节点用来设置一些mybatis的配置项Properties settings settingsAsProperties(root.evalNode(settings));// 加载用户自己配置的虚拟文件系统loadCustomVfs(settings);// 加载日志loadCustomLogImpl(settings);// TODO 解析typeAliases节点下次继续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);}}先看propertiesElement方法该方法用于解析properties节点。 /*** 解析mybatis-config.xml的properties节点* 将节点中所有的配置set到Configuration中** param context* throws Exception*/private void propertiesElement(XNode context) throws Exception {if (context ! null) {// 解析拿到节点下的所有子节点配置Properties defaults context.getChildrenAsProperties();// 获取properties节点的resource属性String resource context.getStringAttribute(resource);// 获取properties节点的url属性。String url context.getStringAttribute(url);if (resource ! null url ! null) {// resource和url属性只能同时存在一个。throw new BuilderException(properties节点不能同时指定resource和url两个属性.);}// url和resource属性只能同时存在一个// 读取引入的资源文件所有属性put到properties节点之下if (resource ! null) {defaults.putAll(Resources.getResourceAsProperties(resource));} else if (url ! null) {defaults.putAll(Resources.getUrlAsProperties(url));}Properties vars configuration.getVariables();// 如果configuration之前已经有了配置也put进去// put这些设置是为了能够保证后面set回configuration时可以set所有的配置if (vars ! null) {defaults.putAll(vars);}parser.setVariables(defaults);// 将Properties节点下所有的配置set到configurationconfiguration.setVariables(defaults);}}接着就是解析settings节点该节点用于配置一些mybatis配置项 /*** 解析settings节点** param context* return*/private Properties settingsAsProperties(XNode context) {if (context null) {return new Properties();}// 获取settings节点下所有的setting节点Properties props context.getChildrenAsProperties();// 通过Configuration获取metaClass用于方便对Configuration进行操作MetaClass metaConfig MetaClass.forClass(Configuration.class, localReflectorFactory);for (Object key : props.keySet()) {// 遍历setting配置// 如果Configuration没有这个set方法说明该配置是无效的if (!metaConfig.hasSetter(String.valueOf(key))) {throw new BuilderException(配置 key 无效. 请检查拼写是否正确.);}}// 校验完settings之后返回return props;}解析完settings节点后程序会加载用户配置的虚拟文件系统和日志。 /*** 加载用户自己设置的虚拟文件系统** param props* throws ClassNotFoundException*/private void loadCustomVfs(Properties props) throws ClassNotFoundException {// 从settings中拿到name是vfsImpl的配置节点String value props.getProperty(vfsImpl);if (value ! null) {String[] clazzes value.split(,);for (String clazz : clazzes) {if (!clazz.isEmpty()) {SuppressWarnings(unchecked)Class? extends VFS vfsImpl (Class? extends VFS) Resources.classForName(clazz);// 加载文件系统set到Configuration中configuration.setVfsImpl(vfsImpl);}}}}/*** 加载日志。代码比较简单* 就是从settings中拿到name为logImpl的配置项* 然后set到Configuration中去** param props*/private void loadCustomLogImpl(Properties props) {Class? extends Log logImpl resolveClass(props.getProperty(logImpl));configuration.setLogImpl(logImpl);}引申 上面的代码中使用到了MetaClass类和Configuration类。下面对这两个类进行解释。 首先是Configuration类。该类通过名称可以很明显的知道这是mybatis的配置类对应的是mybatis-config.xml文件的配置。其中今天将properties和settings节点对应的字段进行注释。 public class Configuration {/*** mybatis-config.xml属性* settings节点* 允许嵌套语句中使用分页*/protected boolean safeRowBoundsEnabled;/*** mybatis-config.xml属性* settings节点* 是否开启自动驼峰命名规则映射* 即从经典数据库列名 a_column 到经典 Java 属性名 aColumn 的类似映射。*/protected boolean mapUnderscoreToCamelCase;/*** mybatis-config.xml文件下* settings节点* 当启用时对任意延迟属性的调用会使带有延迟加载属性的对象完整加载* 反之每种属性将会按需加载。*/protected boolean aggressiveLazyLoading;/*** mybatis-config.xml文件下* settings节点* 是否允许单一语句返回多条结果集*/protected boolean multipleResultSetsEnabled true;/*** mybatis-config.xml文件* settings节点* 允许 JDBC 支持自动生成主键*/protected boolean useGeneratedKeys;/*** mybatis-config.xml文件* settings节点* 使用列标签代替列名*/protected boolean useColumnLabel true;/*** mybatis-config.xml文件* settings节点* 该配置影响的所有映射器中配置的缓存的全局开关*/protected boolean cacheEnabled true;/*** mybatis-config.xml文件* settings节点* 指定当结果集中值为null的时候是否调用映射对象的set方法*/protected boolean callSettersOnNulls;/*** mybatis-config.xml文件* settings节点* 指定MyBatis增加到日志名称的前缀*/protected String logPrefix;/*** mybatis-config.xml文件* settings节点* 指定MyBatis所用日志的具体实现*/protected Class? extends Log logImpl;/*** mybatis-config.xml文件* settings节点* VFS含义是虚拟文件系统* 主要是通过程序能够方便读取本地文件系统、FTP文件系统等系统中的文件资源。* Mybatis中提供了VFS这个配置。* 主要是通过该配置可以加载自定义的虚拟文件系统应用程序* 多个文件系统使用逗号隔开*/protected Class? extends VFS vfsImpl;/*** mybatis-config.xml文件* settings节点* mybatis利用本地缓存机制防止循环引用的加速重复嵌套查询。* 默认是SESSION这种情况会缓存一个会话中执行的所有查询* 如果是STATEMENT本地会话仅用在语句执行上* 对相同的SqlSession的不同调用将不会共享数据*/protected LocalCacheScope localCacheScope LocalCacheScope.SESSION;/*** mybatis-config.xml文件* settings节点* 当没有为菜蔬提供特定的JDBC类型时* 为空值制定JDBC类型*/protected JdbcType jdbcTypeForNull JdbcType.OTHER;/*** mybatis-config.xml* settings节点* 指定哪个对象的方法触发一次延迟加载*/protected SetString lazyLoadTriggerMethods new HashSet(Arrays.asList(equals, clone, hashCode, toString));/*** mybatis-config.xml文件* settings节点* 设置超时时间*/protected Integer defaultStatementTimeout;/*** mybatis-config.xml文件* settings节点* 为驱动程序设置提示以控制返回结果的获取大小*/protected Integer defaultFetchSize;/*** mybatis-config.xml文件* settings节点* 配置默认的执行器。* SIMPLE 就是普通的执行器* REUSE 执行器会重用预处理语句PreparedStatements* BATCH 执行器将重用语句并执行批量更新。*/protected ExecutorType defaultExecutorType ExecutorType.SIMPLE;/*** mybatis-config.xml文件* settings节点* 指定 MyBatis 应如何自动映射列到字段或属性。* NONE 表示取消自动映射* PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。* FULL 会自动映射任意复杂的结果集*/protected AutoMappingBehavior autoMappingBehavior AutoMappingBehavior.PARTIAL;/*** mybatis-config.xml文件下* properties节点的所有配置* 以及该节点对应的resource和url的所有配置* 在XMLConfigBuilder.propertiesElement方法中进行初始化*/protected Properties variables new Properties();/*** mybatis-config.xml文件* settings节点属性* 延迟加载的全局开关。* 当开启时所有关联对象都会延迟加载。* 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态*/protected boolean lazyLoadingEnabled false;/*** mybatis-config.xml文件* settings节点* 指定Mybatis创建具有延迟加载能力对象所用到的代理工厂*/protected ProxyFactory proxyFactory new JavassistProxyFactory();/*** 将数据库类型转换成Java类型*/protected final TypeHandlerRegistry typeHandlerRegistry new TypeHandlerRegistry(this);/*** 存储扫包得到的别名*/protected final TypeAliasRegistry typeAliasRegistry new TypeAliasRegistry();}而MetaClass是反射工具箱里的一个类。Reflector是Mybatis中反射模块的基础每个Reflector对象都对应一个类在该对象中缓存了反射操作需要使用的元信息如可读属性、可写属性、get、set方法等。ReflectorFactory接口主要实现了对Reflector对象的创建和缓存。而MetaClass则是对Reflector和reflectorFactory的封装使其更方便通过反射去操作一个类。 这里就不帖MetaClass的代码了感兴趣可以自行阅读。 结语 今天因为时间充裕所以写的博客比较清晰后面可能会因为加班所以博客仅仅是对代码注释的复制粘贴还希望读者可以谅解。这个坑我会继续填下去的。 最后需要提一下java里的一个容易被忽视的规范也是面试、大学考试经常喜欢问的内容。 类中定义的成员变量也称之为“字段”而属性则是指get和set方法。属性只与方法有关而与字段无关。如一个类中存在getName()和setName(String name)方法不管该类中有没有name字段我们都认为它有name这个属性。反之如果只有字段name而没有对应的get/set方法则该类仅仅是有name这个字段而没有name属性。后面对于get/set方法我不会称之为属性但是有必要分清楚这两个概念。 *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更新 *************************************优雅的分割线 ********************************** SimpleExecutor

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

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

相关文章

网站维护员工作内容代理网页免费

av_packet_unref 该接口使用了如下调用,该接口主要作用是清理AVPacket中的所有空间数据,清理完毕后进行初始化操作,并且将 data 与 size 置为0,方便下次调用。 void av_packet_unref(AVPacket *pkt) {av_packet_free_side_data(pkt);av_buf…

找什么公司做网站怎么自己弄一个公众号

选择合适的扫描仪是进行档案数字化的关键步骤。以下是一些选择合适扫描仪的要点: 1. 扫描速度:选择具有合适的扫描速度的扫描仪,以便能够快速处理大量的文件。 2. 扫描分辨率:扫描分辨率决定了扫描后图像的清晰度。对于大多数文档…

飞书对程序员下手了,0 代码生成各类系统!!(附保姆级项目实战教程)

大家好,我是R哥。 之前我分享了飞书多维表格的妙用:飞书对程序员下手了,0 代码生成各类系统!!包括以下两个重点: 1、飞书多维表格无需下载飞书也能直接使用了,打开 base.feishu.cn 就可以直接使用飞书多维表格。…

Adaptix C2:跨平台渗透测试与对抗仿真框架

Adaptix C2是一个可扩展的后渗透和对抗仿真框架,专为渗透测试人员设计。采用Golang服务端和C++ QT客户端架构,支持Linux、Windows和MacOS多平台操作,提供完整的加密通信、插件化监听器和代理管理功能。项目描述 Ada…

wordpress发布插件太原网站seo

指纹由于其终身不变性、唯一性和方便性,几乎已成为生物特征识别的代名 词。通常我们说的指纹就是人的手指末端正面皮肤上凸凹不平的纹线,纹线规律地排列 形成不同的纹型。而本节所讲的指纹是指网站CMS 指纹识别、计算机操作系统及W eb 容器的指纹识别等…

ncpa.cpl 意义 这个名称的

ncpa.cpl 意义 这个名称的ncpa.cpl 其实是 Windows 控制面板小程序 (Control Panel item) 的文件名。全称含义:nc → Network Connections(网络连接)pa → Panel Applet(控制面板小程序).cpl → Control Panel ex…

国标GB28181软件EasyGBS网页直播平台在邮政快递场景的落地与应用

国标GB28181软件EasyGBS网页直播平台在邮政快递场景的落地与应用随着电子商务的迅猛发展,邮政快递行业迎来了前所未有的发展机遇,但同时也面临着诸多挑战。如何在保障货物安全、提高运输效率的同时,实现全面的监控和…

做网站的软件下载做知乎网站要多少钱

文章目录 1. 数据的关联与合并1.1 join关联1.1.1 内关联1.1.2 左关联1.1.3 右关联 1.2 Union合并 2. 缓存和checkpoint 1. 数据的关联与合并 1.1 join关联 students表数据: 1.1.1 内关联 内关联只返回两个 DataFrame 中在连接键上匹配的行。 # join 关联 from…

创建了网站黄石网站建设黄石

文章目录 引言复习完全背包问题——买书个人实现 状态转换机——股票买卖V个人实现参考实现 新作两数相除个人实现 新作LRU缓存实现个人实现unordered_map相关priority_queue相关 参考实现自己复现 总结 引言 今天知道拼多多挂掉了,难受,那实习就是颗粒无…

长沙教育网站开发秦皇岛建网站

哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。…

做网站一定要买主机吗wordpress书库插件

jquery 实现双击编辑并保存Jesse2013-12-11 19:47:001153最近在做一个数据修改的例子,一个个点开修改很麻烦,于是就想到ecshop后台里的 只需单击就以编辑了,在网上查阅资料,就想到双击修改,失去鼠标焦点后post执行HTML…

北京wap网站建设wordpress重复评论

null可赋值任何变量,将变量置为空 DBNull只用于DataRow对象,表示数据库中的空值 String.Empty是0长度字串 Convert.IsDBNull判断是否为DBNull DBNull.Value与Null的区别 Null是.net中无效的对象引用。 DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空(&l…

做视频网站注意什么天津工程网站建设

一、峰会简介 近年来,以云计算、移动互联网、物联网、工业互联网、人工智能、大数据及区块链等新一代信息技术构建的智能化应用和产品出现爆发式增长,突破了对于软件形态的传统认知,正以各种展现方式诠释着对新型智能软件的定义。这也使得对…

sql统计一个字段各个值各有多个个的方法

sql统计一个字段各个值各有多个个的方法SELECT COUNT(CASE WHEN apprStatus = 1 and policy_id IN(19657ffd7b6o25bj6ojr) THEN 1 END) AS count_init, COUNT(CASE WHEN apprStatus = 2 and policy_id IN(19657ffd7b6o…

完整教程:深度学习-神经网络(上篇)

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

WBS、甘特图、关键路径……项目计划的五大核心概念一文全懂

在做项目时,你是不是经常遇到这种情况:事情一大堆,但总觉得手里没抓住重点; 每天忙忙碌碌,结果一看进度表,发现项目已经延迟; 领导问:“咱们项目什么时候能上线?”你心里没数,只能硬着头皮说“快了快了”。其…

智启新程:哲讯科技引领SAP ERP实施新范式

智启新程:哲讯科技引领SAP ERP实施新范式在全球化竞争与数字化转型的双重驱动下,ERP系统已成为企业高效运营与战略决策的核心支柱。SAP ERP作为全球领先的企业管理解决方案,其成功实施不仅关乎技术落地,更是企业业…

学做湘菜的视频网站win7如何做网站

一、前言 通常情况下,当我们默认安装docker服务时,在不指定默认存储路径时,docker会自动创建目录,经常会出现打满根目录的情况。 默认存储路径为:/var/lib/docker 下 可通过如下进行查询: docker info输出…

品牌购物网站十大排名建官网公司

注:以下所有代码中,红色部分为增加部分。一、在后台增加批量添加按钮打开“phpcms\modules\content\templates\content_list.tpl.php”文件搜索“$category[‘catname‘]));?>”在这句话的后天的添加:a echo"" href":;&q…