mybatis-spring干了哪些你应该知道的勾当之SqlSessionFactoryBean?

SpringBoot整合MyBatis报SqlSessionFactoryBean未找到问题解析 在Java企业级开发中,ORM框架与Spring生态的整合是关键技术环节。MyBatis作为主流持久层框架,通过SqlSessionFactoryBean实现与Spring容器的无缝集成,其核心原理是FactoryBean机制和自动配置。当出现ClassNotFound异常时,往往涉及依赖管理、版本兼容等工程实践问题。本文以SqlSessionFactoryBean加载失败为切入点,深入分析MyBatis-Spring整合机制,提供从基础依赖配置到多模块项目管理的系统解决方案,特别适合处理SpringBoo 阅读详情

转载 :https://www.jianshu.com/p/adf2486ba56e

引子

如果你是一个服务端开发者,而你的主要语言又是Java的话,如果还不知道MyBatis和Spring这二大利器,那我只能对你说:出门右转找百度,左转找谷歌!

  • MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
  • Spring 是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架。
  • MyBatis-Spring 帮助你将 MyBatis 代码无缝地整合到 Spring 中。 使用这个类库中的类, Spring 将会加载必要的 MyBatis 工厂类和 session 类。 这个类库也提供一个简单的方式来注入 MyBatis 数据映射器和 SqlSession 到业务层的 bean 中。 而且它也会处理事务, 翻译 MyBatis 的异常到 Spring 的 DataAccessException 异常中。最终,它并 不会依赖于 MyBatis,Spring 或 MyBatis-Spring 来构建应用程序代码。

通过上面各组件官网上的解释我们已经知道各个是干什么用的吧!

SqlSessionFactoryBean

在基本的MyBatis中,SqlSessionFactory可以使用SqlSessionFactoryBuilder来创建,而在mybatis-spring中,则使用SqlSessionFactoryBean来创建。
XML配置方式:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="mapperLocations" value="classpath*:mappers/**/*.xml" />
</bean>

Java代写方式:

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
factoryBean.setMapperLocations(resolver.getResources("classpath*:mappers/**/*.xml"));
SqlSessionFactory sessionFactory = factoryBean.getObject();

SqlSessionFactoryBean的类设计如下图:

 

SqlSessionFactoryBean设计图

注意: SqlSessionFactoryBean实现了Spring的FactoryBean接口这就说明了由 Spring 最终创建的 bean 不是SqlSessionFactoryBean 本身, 而是工厂类的 getObject()返回的方法的结果 ,即SqlSessionFactory对象。
具体的实现源代码如下:

public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {
  private Resource configLocation;
  private Configuration configuration;
  private Resource[] mapperLocations;
  private DataSource dataSource;
  private TransactionFactory transactionFactory;
  private Properties configurationProperties;
  private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  private SqlSessionFactory sqlSessionFactory;
  //EnvironmentAware requires spring 3.1
  private String environment = SqlSessionFactoryBean.class.getSimpleName();
  private boolean failFast;
  private Interceptor[] plugins;
  private TypeHandler<?>[] typeHandlers;
  private String typeHandlersPackage;
  private Class<?>[] typeAliases;
  private String typeAliasesPackage;
  private Class<?> typeAliasesSuperType;
  //issue #19. No default provider.
  private DatabaseIdProvider databaseIdProvider;
  private Class<? extends VFS> vfs;
  private Cache cache;
  private ObjectFactory objectFactory;
  private ObjectWrapperFactory objectWrapperFactory;

  // 省略getter和setter
  // ...
  @Override
  public void afterPropertiesSet() throws Exception {
    // 省略属性的断言判断
    // ...
    this.sqlSessionFactory = buildSqlSessionFactory();
  }
  @Override
  public SqlSessionFactory getObject() throws Exception {
    if (this.sqlSessionFactory == null) {
      afterPropertiesSet();
    }
    return this.sqlSessionFactory;
  }

  protected SqlSessionFactory buildSqlSessionFactory() throws IOException {
     Configuration configuration;
    // Configuration的构建优先级为:
    // 1. configuration属性,
    // 2. configLocation,MyBatis的配置文件,通常在为“WEB-INF/mybatis-configuration.xml”
    // 3. 如果上面二个属性都没有设置,则使用默认的配置信息
    XMLConfigBuilder xmlConfigBuilder = null;
    if (this.configuration != null) {
      configuration = this.configuration;
      if (configuration.getVariables() == null) {
        configuration.setVariables(this.configurationProperties);
      } else if (this.configurationProperties != null) {
        configuration.getVariables().putAll(this.configurationProperties);
      }
    } else if (this.configLocation != null) {
      xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), null, this.configurationProperties);
      configuration = xmlConfigBuilder.getConfiguration();
    } else {
      LOGGER.debug(() -> "Property 'configuration' or 'configLocation' not specified, using default MyBatis Configuration");
      configuration = new Configuration();
      if (this.configurationProperties != null) {
        configuration.setVariables(this.configurationProperties);
      }
    }
    // 省略部分设置configuration属性代码
    // ...

    // 这里,如果配置的xxxMapper.xml文件的路径,会循环解析xml文件
    if (!isEmpty(this.mapperLocations)) {
      for (Resource mapperLocation : this.mapperLocations) {
        if (mapperLocation == null) {
          continue;
        }

        try {
          XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(mapperLocation.getInputStream(),
              configuration, mapperLocation.toString(), configuration.getSqlFragments());
          xmlMapperBuilder.parse();
        } catch (Exception e) {
          throw new NestedIOException("Failed to parse mapping resource: '" + mapperLocation + "'", e);
        } finally {
          ErrorContext.instance().reset();
        }
      }
     }
    }
   
    // 这里根据configuration构建出SqlSessionFactory
    return this.sqlSessionFactoryBuilder.build(configuration);
  }

  // ...
}

从这个类中我们可以看到,buildSqlSessionFactory干了主要的工作,从Configuration的初始化,到Configuration中各个属性值的设置,以及Mapper的xml文件解析。

属性

  • DataSource - SqlSessionFactory有一个单独的必须属性就是JDBC的DataSource.
  • mapperLocations - 如果MyBatis映射器XML文件在和映射器类相同的路径下不存在,那么就需要配置这个属性;使用这个配置有两种选择:
  1. 手动在MyBatis的XML配置文件中使用<mappers>部分来指定类路径;
  2. 使用SqlSessionFactoryBean的mapperLocations属性;

至此,SqlSessionFactoryBean类的功能基本讲完了,如果你有其他想法和意见可以下在方留言~~

 

 

 

SpringBoot整合MyBatis时SqlSessionFactoryBean未找到的解决方案 在Java企业级开发中,ORM框架MyBatis与SpringBoot的整合是常见的技术组合。SqlSessionFactory作为MyBatis的核心组件,负责管理数据库会话的生命周期。当Spring容器无法创建SqlSessionFactoryBean实例时,通常意味着依赖配置或自动装配环节出现问题。通过分析依赖树、检查版本兼容性以及合理配置Mapper扫描路径,可以解决这类集成问题。本文针对常见的'SqlSessionFactoryBean未找到'异常,从依赖管理、自动配置原理到多模块项目处理,提供了 阅读详情

相关推荐

手把手教你用SIMCOM A7670C_FASL模组实现双路MQTT连接阿里云(附完整源码)

本文详细介绍了如何使用SIMCOM A7670C_FASL 4G模组实现双路MQTT连接阿里云,包括硬件配置、开发环境搭建、双路MQTT架构设计及实现细节。通过完整的源码示例和实战指南,帮助开发者快速掌握物联网设备开发中的多路MQTT连接技术,提升工业级应用的开发效率。

weixin_33696822的博客 227

spring-mybatis 之SqlSessionFactoryBean

在 MyBatis 中,使用 SqlSessionFactoryBuilder创建SqlSessionFactory ,进而来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时候, 你可以关闭 session。  Mybatis社区自己开发了一个Mybatis-Spring用来满足Mybatis用户整合Spring

赶路人儿 5万+

[pytorch]FixMatch代码详解(超详细)

FixMatch代码详解-训练过程参数数据产生构建模型训练参数设置weight decay(权值衰减)学习率衰减(learning rate decay)指数移动平均(EMA)model训练过程运行结果 上一篇大概讲了数据加载的过程,这一篇更进一步,分析一下训练是怎样进行的 上一篇链接: [pytorch]FixMatch代码详解-数据加载 参数 所有的参数我都默认使用作者给出的例子: python train.py --dataset cifar10 --num-labeled 4000 --arch w

qq_38736504的博客 1万+

【MyBatis】Spring集成原理(一):创建 SqlSessionFactory

这里我们以传统的Spring为例,因为配置更直观,在Spring中使用配置类注解是一样的。在前面的课程里面,我们基于编程式的工程已经弄清楚了MyBatis的工作流程、核心模块和底层原理。编程式的工程,也就是MyBatis的原生API里面有三个核心对象:SqlSessionFactory、SqlSession、MapperProxy。 大部分时候我们不会在项目中单独使用MyBatis的工程,而是集成到Spring里面使用,但是却没有看到这三个对象在代码里面的出现。我们直接注入了一个Mapper接口,调用它的方

A minor 2071

H5获取手机相机或相册图片两种方式-Android通过webview传递多张照片给H5

H5调用公共获取图片文件方法,在android手机端,H5主要依赖Webview,这边在webview声明并重写该方法onShowFileChooser使用工具类打开相机或相册,可以两种方式安卓原生方式或者利用第三方组件库方式选中图片,返回uri列表给H5H5收到uri照片列表,并且使用前端方式展示创造价值,乐哉分享!

m0_74823947的博客 3096

ADS 使用教程(一)Workspace, Library and Cell

简要介绍ADS的基本内容

Dirge19的博客 6617

mybatis与spring的整合之SqlSessionFactoryBean

mybatis与spring的整合之SqlSessionFactoryBeanSqlSessionFactoryBean配置注入mapperLocations注入configLocationmapperLocations与configLocation比较SqlSessionFactoryBean源码跟踪实现了FactoryBean接口实现了InitializingBean接口dataSource不...

yu_kang的博客 4万+

Windows下的Geant4安装教程

本教程将从0开始展示在Windows下如何安装Geant4,包括各种辅助工具(QT、Cmake、Visual Studio)的下载安装,环境变量的配置,以及example的生成等。

weixin_49065278的博客 4113

Mybatis-Spring 的高级配置 (SqlSessionFactoryBean)

一、SqlSessionFactoryBean mybatis-spring 官网 在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建。而在 MyBatis-spring 中,则使用SqlSessionFactoryBean 来替代:   &lt;bean id="sqlSessionFactory" class="...

bingguang1993的博客 4024

奇迹mu服务端DATA文件解析:从基础配置到高级玩法

本文深入解析奇迹MU服务端DATA文件的核心配置与高级玩法,涵盖基础设置、怪物AI系统、技能战斗机制、副本事件管理及物品商城定制。通过详细示例和实用技巧,帮助开发者掌握从经验倍率调整到动态事件触发的全方位配置方法,实现个性化的私服搭建与运营。

weixin_29254673的博客 532

OpenHarmony开发一个App,安装到BearPi-HM Micro开发板

建议先阅读我们这篇,这里面详细介绍了,以及hap包安装的全过程。本篇是介绍如何开发一个App,然后安装到开发板上,比如hap包,无法安装等问题。

Halifax 1030

MyBatis-Spring (二) SqlSessionFactoryBean

设置 要创建工厂 bean,将下面的代码放到 Spring 的 XML 配置文件中: <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean> 需要注意的是 SqlSessionFactoryBean 实现了 Spring 的 FactoryBean 接口(

S2020chenxin的博客 3125

【思考模型框架】MECE原则,确保分析时,考虑到的所有因素,既不重叠又无遗漏

MECE原则,是Mutually Exclusive and Collectively Exhaustive的缩写,中文译为“相互独立、完全穷尽”。MECE原则,这是一种逻辑思维和组织信息的方法,旨在确保分析时既没有遗漏也没有重复。MECE原则,相互独立、完全穷尽(Mutually Exclusive,Collectively Exhaustive)的原则MECE原则,确保分析时考虑到的所有因素既不重叠又无遗漏。

奶爸的编程之路,也就一周冷个三天 2755

mybatis是如何集成到spring的之SqlSessionFactoryBean

我们注册的是SqlSessionFactoryBean这个bean,为什么却说SqlSessionFactory也成为了spring的bean呢?我们的SqlSessionFactoryBean还实现了FactoryBean这个接口。Spring 中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean 即 FactoryBean。FactoryBean跟普通Bean不同,其返回的对象不是指定类的一个实例,而是该FactoryBean的getObject方法所返回的对象。

GAMELOFT9----纸上得来终觉浅,绝知此事要躬行 2325

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

Spring整合MyBatis:SqlSessionFactoryBean【基础】

SqlSessionFactoryBean 是一个负责生产 SqlSessionFactory 的工厂 Bean, 当想从容器中获取 SqlSessionFactory 对象时,Spring 会调用其 getObject() 方法进行获取。

mrguif的博客 3102

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Mybatis整合Spring -- SqlSessionFactoryBean

Mybatis整合Spring 根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持。因此由Mybatis社区自己开发了一个Mybatis-Spring用来满足Mybatis用户整合Spring的需求。下面就将通过Mybatis-Spring来整合Mybatis跟Spring的用...

qq_27088383的博客 642

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MyBatis-Spring-SqlSessionFactoryBean

MyBatis-Spring-SqlSessionFactoryBean 详解

找寻你的足迹123 3045

Spring-Mybatis --- 配置SqlSessionFactoryBean,整合Spring-Mybatis

要利用Mybatis首先是需要导入mybatis-x.x.x.jar,其次,要整合Spring和Mybatis需要导入mybatis-spring-x.x.x.jar。   JAR : mybatis-x.x.x &lt;dependency&gt; &lt;groupId&gt;org.mybatis&lt;/groupId&gt; ...

Angus博客 3454

MyBatis-Spring核心:SqlSessionFactoryBean详解

SqlSessionFactoryBean是MyBatis与Spring集成的核心组件,作为工厂Bean在Spring容器启动时自动创建并管理MyBatis的SqlSessionFactory。相比原生MyBatis需手动构建,它通过实现FactoryBean接口,让Spring调用其getObject()方法生成实际的SqlSessionFactory。关键配置包括:必需的dataSource数据源;可选的configLocation指定外部MyBatis配置文件(但会忽略环境相关配置);推荐使用的map

m0_37607945的博客 480

【第14章】MyBatis-Spring之SqlSessionFactoryBean

在基础的 MyBatis 用法中,是通过 SqlSessionFactoryBuilder 来创建 SqlSessionFactory 的。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来创建。SqlSessionFactory 有一个唯一的必要属性:用于 JDBC 的 DataSource。这可以是任意的 DataSource 对象,它的配置方法和其它 Spring 数据库连接是一样的。属性描述dataSource。

zjg 1486

mybatis-spring:SqlSessionFactoryBean

引言 在demo: springboot+mybatis的MybatisConfig中有这样两个bean配置(事务此时不看): // 数据源配置 @Bean public DataSource dataSource() { // mybatis自带的一个简易数据库连接池,只是为了debug代码,这个就不关心了 PooledDataSou...

程序猿的樊笼 2841

MyBatis与Spring集成原理:SqlSessionFactoryBean源码分析

作为Java开发中最流行的持久层框架之一,MyBatis与Spring的完美集成是其成功的关键因素。本文将通过深入分析SqlSessionFactoryBean的源码实现,揭示MyBatis与Spring集成的核心原理,帮助开发者更好地理解和使用这一强大的技术组合。 ## 什么是SqlSessionFactoryBean? **SqlSessionFactoryBean**是MyBatis-S

gitblog_00388的博客 814

MyBatis-Spring之SqlSessionFactoryBean

MyBatis-Spring官方文档 MyBatis-Spring官方文档 MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中 源码 成员变量 private static final Log LOGGER = LogFactory.getLog(SqlSessionFactoryBean.class); private Resource...

thebigdipperbdx的博客 850

MyBatis入门系列(22) -MyBatis-Spring核心源码解析之SqlSessionFactoryBean

前言 在之前使用了mybatis的文档中,我们需要手动创建SqlSessionFactory对象来获取SqlSession,然后通过SqlSession获取mapper代理对象,进行数据库操作。 // 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); Sql

记录知识、锤炼自我 5785

MyBatis-spring之SqlSessionFactoryBean

在基础的 MyBatis 用法中,是通过SqlSessionFactoryBuilder来创建SqlSessionFactory的。 而在 MyBatis-Spring 中,则使用SqlSessionFactoryBean来创建。 常用属性 DataSource SqlSessionFactory有一个唯一的必要属性:用于 JDBC 的DataSource。这可以是任意的Da...

ystyaoshengting的专栏 884
上一篇: 从 Java 到 Scala,再到 Kotlin
下一篇: 《Spring技术内幕 第2版》学习笔记
琅琊山二当家
博客等级 码龄18年 447粉丝 322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值