mybatis-plus源码分析-1-sqlSessionFactory的生成

MyBatis-Plus与SpringBoot整合(01--SqlSessionFactory的注入) 然后继续看MybatisSqlSessionFactoryBuilder【3】的build方法, 里面调用了super.build(configuration),该类继承了mybatis的SqlSessionFactoryBuilder类。第二,我们看类上的关键方法sqlSessionFactory,通过Bean结合FactoryBean机制进行SqlSessionFactory的注入(FactoryBean的实际运用实例)第二种情况才是最常见、最重要的,毕竟谁也不会一直跑一个空项目吧。 阅读详情


注:本篇本人看的较为混乱,而且个人觉得实际收获不是很大,因此可以选择跳过,直接去看源码分析-2-MapperScanner。**

预备知识:

在spring整合mybatis时,我们需要配置以下3个东西:

  • dataSource(数据源)
  • sqlSessionFactory
  • MapperScanner(Mapper扫描器)

本次将介绍的是sqlSessionFactory的生成,在讲解具体代码之前,先列出mybatis-plus的SqlSessionFactory包含的6种重要属性,以方便后续代码理解:

<bean id="sqlSessionFactory"  
 class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">  
 <!-- 配置数据源 -->  
 <property name="dataSource" ref="dataSource" />  
 <!-- 自动扫描 Xml 文件位置 -->  
 <property name="mapperLocations" value="classpath*:com/ds/orm/mapper/**/*.xml" />  
 <!-- 配置 Mybatis 配置文件(可无) -->  
 <property name="configLocation" value="classpath:mybatis-config.xml" />  
 <!-- 配置包别名,支持通配符 * 或者 ; 分割 -->  
 <property name="typeAliasesPackage" value="com.ds.orm.model" />  
 <!-- 枚举属性配置扫描,支持通配符 * 或者 ; 分割 -->  
 <property name="typeEnumsPackage" value="com.baomidou.springmvc.entity.*.enums" /> 

 <!-- MP 全局配置注入 -->  
 <property name="globalConfig" ref="globalConfig" />  
</bean>  

提前总结:流程图

1556618422137

正式开始

第一步:项目中引入mybatis-plus:

pom.xml
	<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.1.1</version>
  </dependency>

第二步:可以从扩展库(external Libraries)中查看到mybatis-plus-boot-starter的源码。

image

红框部分spring.factories中记录了spring-boot-starter类项目的入口为MybatisPlusAutoConfiguration:

spring.factories:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

接下来查看MybatisPlusAutoConfiguration.java是如何完成初始化配置的。

从注解的角度看:

image

  • @Configuration是将该类加入spring容器当中,

  • @ConditionalOnClass({SqlSessionFactory.class, MybatisSqlSessionFactoryBean.class})

    SqlSessionFactory,MybatisSqlSessionFactoryBean类的依赖存在。

  • @ConditionalOnSingleCandidate(DataSource.class) DataSource这个实例必须存在

  • @AutoConfigureAfter(DataSourceAutoConfiguration.class) 其他的类加载完之后,再加载DataSourceAutoConfiguration这个类,它主要是完成数据配置初始化。

阅读代码后发现,该类的核心便是配置SqlSessionFactory,因此接下来进行具体了解:

配置SqlSessionFactory

代码如下:

@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
// TODO 使用 MybatisSqlSessionFactoryBean 而不是 SqlSessionFactoryBean
MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setVfs(SpringBootVFS.class);
//设置configurationLocation到factory中
if (StringUtils.hasText(this.properties.getConfigLocation())) {
   factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
}

//设置configuration到factory中,后面会用到!
applyConfiguration(factory);

if (this.properties.getConfigurationProperties() != null) {
   factory.setConfigurationProperties(this.properties.getConfigurationProperties());

   
//设置TypeAliasesPackage、TypeAliasesSuperType、TypeHandlersPackage、MapperLocations
  if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
      factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
  }
  if (this.properties.getTypeAliasesSuperType() != null) {
      factory.setTypeAliasesSuperType(this.properties.getTypeAliasesSuperType());
  }
  if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
      factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
  }
  if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
      factory.setMapperLocations(this.properties.resolveMapperLocations());
  }         
   
//...设置其他属性到factory中,代码略
	 ...
...    

   
factory.setGlobalConfig(globalConfig);
	return factory.getObject();
}

先看注释和方法声明:@ConditionalOnMissingBean是在Spring容器中缺少bean的时候,创建SqlSessionFactory这个对象,DataSource这个对象会在这个方法中会自动注入进来,这是Spring的IOC来完成的。

再看具体实现:创建一个MybatisSqlSessionFactoryBean的实例,它是实现Spring中FactoryBean接口的类,然后在这个实例中设置DataSource,VFS,ConfigLocation,MybatisConfiguraition等属性。

    private void applyConfiguration(MybatisSqlSessionFactoryBean factory) {
        // 取出configuration
        MybatisConfiguration configuration = this.properties.getConfiguration();
        //若configuration为空,new或者自定义生成。
        if (configuration == null && !StringUtils.hasText(this.properties.getConfigLocation())) {
            configuration = new MybatisConfiguration();
        }
        if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {
            for (ConfigurationCustomizer customizer : this.configurationCustomizers) {
                customizer.customize(configuration);
            }
        }
        //设置到factory中
        factory.setConfiguration(configuration);
    }

接下来就是设置各种属性。(代码略)

需要注意的是,sqlSessionFactory返回的值是 return factory.getObject();因此我们接着查看 factory.getObject()方法。

    public SqlSessionFactory getObject() throws Exception {
        if (this.sqlSessionFactory == null) {
            this.afterPropertiesSet();
        }

        return this.sqlSessionFactory;
    }

可以看到getObject获取SqlSessionFacoty,会调用afterPropertiesSet(),代码如下:

    public void afterPropertiesSet() throws Exception {
        Assert.notNull(this.dataSource, "Property 'dataSource' is required");
        Assert.notNull(this.sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");
        Assert.state(this.configuration == null && this.configLocation == null || this.configuration == null || this.configLocation == null, "Property 'configuration' and 'configLocation' can not specified with together");
        this.sqlSessionFactory = this.buildSqlSessionFactory();
    }

可以看到afterPropertiesSet紧接着会调用 buildSqlSessionFactory()方法,该方法便用来构造SqlSessionFactory,代码很长,我们一点一点分析:

构建SqlSessionFactory

下面的代码

protected SqlSessionFactory buildSqlSessionFactory() throws Exception {
    	//第一部分:将configuration、configurationProperties以及globalConfig设置到targetConfiguration中
        MybatisXMLConfigBuilder xmlConfigBuilder = null;
        MybatisConfiguration targetConfiguration;
        //因为前面有设置configuration,所以一定会进入这一个if
    	if (this.configuration != null) 
            targetConfiguration = this.configuration;
            if (targetConfiguration.getVariables() == null) {
                targetConfiguration.setVariables(this.configurationProperties);
            } else if (this.configurationProperties != null) {
                targetConfiguration.getVariables().putAll(this.configurationProperties);
            }
        } else if (this.configLocation != null) {
            xmlConfigBuilder = new MybatisXMLConfigBuilder(this.configLocation.getInputStream(), (String)null, this.configurationProperties);
            targetConfiguration = xmlConfigBuilder.getConfiguration();
        } else {
            //略
        }
    
        this.globalConfig = (GlobalConfig)Optional.ofNullable(this.globalConfig).orElseGet(GlobalConfigUtils::defaults);
        this.globalConfig.setDbConfig((DbConfig)Optional.ofNullable(this.globalConfig.getDbConfig()).orElseGet(DbConfig::new));
        targetConfiguration.setGlobalConfig(this.globalConfig);
        if (targetConfiguration.isMapUnderscoreToCamelCase()) {
            targetConfiguration.setObjectWrapperFactory(new MybatisMapWrapperFactory());
        }

这一整块代码的唯一功能:将configuration、configurationProperties以及globalConfig设置到targetConfiguration中。

因为前文提到了configuration已经设置到factory中,因此一定会进入第一个if,而第一个if的作用是将configuration和configurationProperties设置到targetConfiguration中。

typeEnumsPackage及typeAliasesPackage的注册

下面一段代码主要功能为:获取枚举属性(typeEnumsPackage)以及包别名(typeAliasesPackage),并进行注册。

枚举的注册,就是把其存入Map<JdbcType, TypeHandler<?>> map这一内存中。

别名的注册,是将别名(例如user)及其类型(例如User.class)存入 Map<String, Class<?>> typeAliases这一内存中。

        if (StringUtils.hasLength(this.typeEnumsPackage)) {
            //这一整个if-else的功能:生成typeEnumsPackage的class文件,并存入Set<Class<?>> classes中。
            Object classes;
            //假如包名包含*或,或; 例如:com.study.*
            if (this.typeEnumsPackage.contains("*") && !this.typeEnumsPackage.contains(",") && !this.typeEnumsPackage.contains(";")) {
                //1.将包名com.study.*转化成具体路径:classpath*: com/study/*.class
                //2.根据具体路径生成Class类,然后存入Set<Class<?>>中,返回该Set
                classes = PackageHelper.scanTypePackage(this.typeEnumsPackage);
                if (((Set)classes).isEmpty()) {
                    LOGGER.warn(() -> {
                        return "Can't find class in '[" + this.typeEnumsPackage + "]' package. Please check your configuration.";
                    });
                }
            } else {
                //1.把报名按照",; \t\n"进行切割。
                //2.切割后步骤同上:转化成具体路径然后存入Set<Class<?>>中
                String[] typeEnumsPackageArray = StringUtils.tokenizeToStringArray(this.typeEnumsPackage, ",; \t\n");
                com.baomidou.mybatisplus.core.toolkit.Assert.notNull(typeEnumsPackageArray, "not find typeEnumsPackage:" + this.typeEnumsPackage, new Object[0]);
                classes = new HashSet();
                Stream.of(typeEnumsPackageArray).forEach((typePackage) -> {
                    Set<Class<?>> scanTypePackage = PackageHelper.scanTypePackage(typePackage);
                    if (scanTypePackage.isEmpty()) {
                        LOGGER.warn(() -> {
                            return "Can't find class in '[" + typePackage + "]' package. Please check your configuration.";
                        });
                    } else {
                        classes.addAll(PackageHelper.scanTypePackage(typePackage));
                    }

                });
            }

            //遍历Set<Class<?>> classes,并注册到typeHandlerRegistry中。
            //所谓的注册,就是把其存入并注册到typeHandlerRegistry中的Map<JdbcType, TypeHandler<?>> map这一内存中。
            TypeHandlerRegistry typeHandlerRegistry = targetConfiguration.getTypeHandlerRegistry();
            ((Set)classes).stream().filter(Class::isEnum).filter((cls) -> {
                return IEnum.class.isAssignableFrom(cls) || EnumTypeHandler.dealEnumType(cls).isPresent();
            }).forEach((cls) -> {
                typeHandlerRegistry.register(cls, EnumTypeHandler.class);
            });
        }

		//生成包别名(typeAliasesPackage)
        if (StringUtils.hasLength(this.typeAliasesPackage)) {
            Set var10000 = this.scanClasses(this.typeAliasesPackage, this.typeAliasesSuperType);
            TypeAliasRegistry var10001 = targetConfiguration.getTypeAliasRegistry();
            var10000.forEach(var10001::registerAlias);
        }

		//注册别名到TypeAliasRegistry中
        if (!ObjectUtils.isEmpty(this.typeAliases)) {
            Stream.of(this.typeAliases).forEach((typeAlias) -> {
                targetConfiguration.getTypeAliasRegistry().registerAlias(typeAlias);
                LOGGER.debug(() -> {
                    return "Registered type alias: '" + typeAlias + "'";
                });
            });
        }

​

紧接着配置plugins、typeHandlersPackage、typeHandlers、DatabaseId以及事物工厂TransactionFactory到targetConfiguration中。(代码略)

mapperLocation中xml文件的解析及注册

最后对于属性mapperLocation,使用了ibatis自带的XMLMapperBuilder.parse()方法来验证mapperLocation的合法性

        if (this.mapperLocations != null) {
            if (this.mapperLocations.length == 0) {
                LOGGER.warn(() -> {
                    return "Property 'mapperLocations' was specified but matching resources are not found.";
                });
            } else {
                Resource[] var50 = this.mapperLocations;
                int var54 = var50.length;

                for(int var5 = 0; var5 < var54; ++var5) {
                    Resource mapperLocation = var50[var5];
                    if (mapperLocation != null) {
                        try {
                            //核心代码:用到的是ibatis自带的XMLMapperBuilder.parse()方法来验证mapperLocation的合法性
                            XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(mapperLocation.getInputStream(), targetConfiguration, mapperLocation.toString(), targetConfiguration.getSqlFragments());
                            xmlMapperBuilder.parse();
                        } catch (Exception var41) {
                            throw new NestedIOException("Failed to parse mapping resource: '" + mapperLocation + "'", var41);
                        } finally {
                            ErrorContext.instance().reset();
                        }

                        LOGGER.debug(() -> {
                            return "Parsed mapper file: '" + mapperLocation + "'";
                        });
                    }
                }
            }
        } 

这里可以看到使用了XMLMapperBuilder.parse()方法来进行解析,具体解析及后续步骤与mybatis的无异,详见**“mybatis动态代理.md”**

[2021-10-18] MyBatis-plus项目打包遇到的问题记录,sqlSessionFactory配置 MyBatis-plus打包遇到问题记录 我的项目是Spring Boot整合了MyBatis-plus,maven引入如下 <!-- 持久层框架 mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> 阅读详情

相关推荐

SpringBoot+AOP+MybatisPlus实现多数据源动态切换遇到关于sqlSessionFactoryBean的坑

多数据源动态切换需要自定义实例化sqlSessionFactoryBean 然后自定义的需要手动设置setMapperLocations、setTypeAliasesPackage不然执行sql时会报 org.apache.ibatis.binding.BindingException: * Invalid bound statement (not found)… 原因以及解决方案如下: @Bean @ConfigurationProperties(prefix = "mybatis") p

qq_36457702的博客 2799

Mybatis-plus 定义SqlSessionFactory

Mybatis-plus 定义SqlSessionFactory

m0_56419249的博客 3614

源码分析 – MyBatis Plus 多数据源踩坑

公司准备把报表数据库从MySQL迁到TiDB,先用几个功能试点。于是在系统上需要配置多个数据源。之前在上家公司用MyBatis时配置过4个数据源,MyBatis Plus下应该是大同小异。不出意外的话就要出意外,结果还是踩了坑。...

YYniannian的博客 617

【SpringBoot】MyBatis-plus 报错 sqlSessionFactory sqlSessionTemplate 最新解决办法

其他的帖子大多都停留在 SpringBoot 2版本时代,MyBatis 在2022年11月才对 SpringBoot 3 提供支持,如果其他文章不能解决该报错,那么新的途径如下。

叼辣条闯天涯 6155

Doris + Iceberg 实现高效数据湖分层:架构解析与最佳实践

本文深入解析了如何利用Doris与Iceberg构建高效的数据湖冷热分层架构。通过将高频访问的热数据存储在Doris中以实现毫秒级查询,同时将历史冷数据归档至低成本的Iceberg存储,该方案在保障查询性能的同时显著降低了总体拥有成本。文章详细阐述了从架构设计、自动化迁移到统一查询的最佳实践,为应对海量数据下的成本与性能平衡提供了实战指南。

weixin_29207533的博客 135

亿图图示(edrawmax中文版) v10.1.7pjb

edrawmax中文名叫做亿图图示,是一款非常棒的综合图形图表设计软件,既能实现流程图、架构图、工程图、思维导图等数百种专业领域图形图表的绘制,又能提供一个白板进行头脑风暴和任意编排,轻松实现数据和创意的可视化呈现。软件支持Windows、Mac、Linux及网络版,一端创作,多端同步,从而为跨端办公绘图提供新的解决方案,还兼容常用文档类的办公软件格式,包括图片、Office、PDF、Visio、Html、SVG等,尽可能的在文件格式这块满足用户多方面需求。软件支持创建260多种图表类型,拥有超过12500

qq_43293214的博客 1万+

mybatis-plus源码分析之sql注入器

mybatis-plus是完全基于mybatis开发的一个增强工具,它的设计理念是在mybatis的基础上只做增强不做改变,为简化开发、提高效率而生,它在mybatis的...

后端进阶 3047

ADS2023仿真变容二极管特性

仿真S-Param仿真控件,设置为Single Point,将频率设置为1MHz,同时勾选Z-parameters,取消S-parameters,从元件库中选择元器件搭建原理图,并根据器件spice提供的相关参数,对原理图中器件参数进行修改,修改完成的电路图如下图所示。添加var控件和MeasEqn控件,相关设置如图所示,Ct为变容管的电容值,Q0为其品质因数。因此,对变容二极管的模型仿真结果是可以信赖的。将其解压,在spice文件夹中,可以找到我们想要的器件参数,和仿真简要电路图。

weixin_45811090的博客 1万+

mybatis源码之创建SqlSessionFactory代码分析

这个mybatis源码分析系列会尽量全面地分析mybatis的核心执行流程、与springboot的集成流程。 待分析的课题 xml mapper独立使用源码分析 mapper接口独立使用源码分析 springboot集成源码分析 mybatis-plus核心源码分析 mybatis-plus与springboot集成源码分析 环境准备 开发环境 windows 10 java 1.8 mybatis版本 mybatis 3.5.6依赖: <dependency> <groupId

xuguofeng2016的博客 1191

手把手教你用NetToPLCsim搭建西门子S7-1200仿真环境(附避坑指南)

本文详细指导如何利用NetToPLCsim与PLCSIM搭建西门子S7-1200仿真环境,实现无硬件条件下的PLC程序测试与上位机通信开发。内容涵盖软件选型、环境部署、关键参数配置及通信测试,并重点提供了连接失败、数据读写错误等常见问题的深度避坑指南,帮助工程师高效构建可靠的虚拟调试工作流。

a3b4c5的博客 614

谷歌学术用publish-or-perish来对引用量排序

用谷歌学术搜索文献的时候发现不能按照引用量高低进行排序,网上提供了这个软件。 下载地址如下:Publish or Perish (harzing.com)https://harzing.com/resources/publish-or-perish 关于软件界面页面和各种指标的介绍,可以参考中科大的这个PPT: 文献分析软件——publish or perish(精品·公开课件).ppt (book118.com)https://max.book118.com/html/2018/1124/813

m0_48878989的博客 1万+

mybatis plus 日志打印_mybatis升级为mybatis-plus踩到的坑

前言最近使用RuoYi-Vue来做后台管理脚手架。RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源。其官方文档如下http://doc.ruoyi...

weixin_39844942的博客 1032

Windows 11 安装、使用 Git:下载、安装、概念、命令、分支模型

本文详细介绍了在 Windows 11 系统上安装与使用 Git 的完整流程,涵盖从官方或国内镜像下载安装包、关键安装选项配置,到 Git 核心概念(如工作区、暂存区、分支、远程仓库等)的通俗解释。同时梳理了常用命令与五种主流 Git 分支模型(如 Git Flow、GitHub Flow 等),帮助开发者根据项目规模选择合适的工作流,是面向初学者与进阶用户的实用指南。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2389

mybatis-plus读取mapper源码分析

加载mapper接口类,并注册bean为mapperFactoryBean。加载sqlSessionFacory, 读取xml文件,作为mapper到mybatisMapperProxyFactory的映射表,存入到 MybatisConfiguration。

流离岁月的博客 1319

3.详解Labview串口通讯--从串口线连接到串口通讯保姆级教程

本文非常详细的介绍了使用Labview实现串口通讯,读完题主这篇文章,即使你是今天刚下载的Labview,也能熟练的连接并驱动串口执行,接下来和我一起学习下,记得关注并点赞不迷路

关注我,更多技术问题欢迎私聊~ 1万+

使用openclaw出现blocked URL fetch (url-fetch) reason=Blocked: resolves to private/internal/special 解决方案

本文主要介绍了使用openclaw出现blocked URL fetch (url-fetch) target=https://news.google.com/search reason=Blocked: resolves to private/internal/special-use IP address 解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

梳理一下mybatis到plus的基本代码逻辑(待完善)

为了快速弄清楚,跟踪了一下代码,梳理了一下实现逻辑。

herriman的博客 1196

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MyBatis-Plus核心流程与源码分析

Mybatis BatchExecutor源码分析目录概 述MyBatis-plus总结:相关工具如下:分析:小结:参考资料和推荐阅读 LD is tigger forever,CG are not brothers forever, throw the pot and shine forever. Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and sta

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 1149

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

springboot集成mybatis-plus源码分析

本文介绍springboot-集成mybatis-plus,(又出现很多以Mybatis开头的配置类),启动时如何加载各个类,解析配置文件,生成接口代理类。sql执行器。 自定配置入口 1.找到自动配置类MybatisPlusAutoConfiguration,会看到 @Bean @ConditionalOnMissingBean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {}

wangfenglei123456的博客 732

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MyBatis-Plus和SpringBoot的整合

简介 MyBatis-Plus是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 一、MyBatis-Plus和SpringBoot整合应用 1.1 项目依赖 在原项目依赖上,加上下面依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-start

clyu的博客 3165

【mybatis和mybatis-plus】源码分析

官方提供了几个拦截器,我们可以在最前面先添加我们自己的拦截器,在执行的时候会最高优先级执行,如果是作为根模块来封装,可以通过责任链模式来构造一个我们自己的拦截器链,业务项目继承封装的接口即可/*** 查询拦截* @return*//*** 修改拦截* @return*/return 0;

qq_36382225的博客 1306

mybatisplus源码分析

创建builder,给configuration添加组件,给builder添加parser extends xmlparser 包含configuration。parseDynamicTags 处理子节点处理${},遇到标签则新建对应slqnode实现类,并处理子节点 放入contents中。fNodePrevSib(链表)存放上一个节点,跟当前节点同级,新建属性后修改fNodeExtra为当前属性,结尾 扫描剩下的属性 v e s 开头 没到"号 就一个一个字节的读。

qq_31081767的博客 960

mybatis源码分析(1)——SqlSessionFactory实例的产生过程

  在使用mybatis框架时,第一步就需要产生SqlSessionFactory类的实例(相当于是产生连接池),通过调用SqlSessionFactoryBuilder类的实例的build方法来完成。下面具体对这一过程涉及的源码进行分析。 首先用Eclipse工具查看SqlSessionFactoryBuilder类的Outline视图: 从上图中可以看出,SqlSessio...

weixin_34303897的博客 100

MyBatis源码分析,一、XmlConfigBulider

读取配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); 创建SqlSessionFactory 将读取的配置文件流传给SqlSessionFactoryBulider, SqlSessionFactoryBulider里面内置一个XmlConfigBulider, XmlConfigBulider里内置了一个XPathParse对象,

weixin_42875415的博客 3603

【源码分析】MyBatis-Plus多数据源环境下的“消失的 MappedStatements“

在进行MySQL 8到openGauss的数据库平滑迁移项目中,为了确保线上业务不中断,我们采用了“双写双读”的架构过渡方案。技术环境配置架构:通过定义了两个独立的: 对应存量 MySQL 生产库。: 对应影子/目标 openGauss 库。在多数据源架构中,上下文的对称性是解决问题的关键。遇到“找不到方法映射”的错误,不要只盯着 XML 看,要从 SqlSessionFactory 的注册机制入手。

Rat1onal的博客 400

mybatisplus 配置引起的生产问题 no bean ‘sqlSessionFactory‘

文章目录问题描述问题背景问题分析源码分析问题解决 问题描述 在项目中集成mybatis-plus以后,项目在开发工具中可以正常启动,本地和前端愉快的调试。但是用docker部署启动时出现问题。报错信息如下,这种情况下,是不是有点懵逼了。都调试好了,快要上线,结果docker部署不了?那应该是jar出的问题 以下摘录docker 报错信息 [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' thre

t18092838767的博客 3759
上一篇: mybatis-plus使用
下一篇: mybatis-plus源码分析-2-mapper扫描
余冰涛
博客等级 码龄11年 42粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值