Spring Data

JdbcTemplate

JDBC(Java Data Base Connectivity, Java 数据库连接)是一种用于执行各种数据库操作的 API,可以为多种数据库提供统一访问接口。

JdbcTemplate是Spring框架对JDBC的封装,主要目的是简化数据库操作。它提供了许多方法来进行数据库操作,如查询、更新、删除等。通过注入DataSource,JdbcTemplate可以与数据库连接池进行交互,从而实现对数据库的操作‌。

使用步骤

使用JdbcTemplate的基本步骤

  1. ‌引入相关jar包‌:确保项目中包含了Spring和JDBC相关的jar包。
  2. ‌配置DataSource‌:在Spring配置文件中配置DataSource,通常使用Druid或HikariCP等连接池。
  3. ‌配置JdbcTemplate‌:在Spring配置文件中定义JdbcTemplate,并将其dataSource属性设置为上面配置的DataSource。
  4. ‌使用JdbcTemplate‌:通过注入JdbcTemplate对象,调用其提供的方法进行数据库操作。

常用方法

jdbcTemplate主要提供的5类方法及使用:

  1. execute() 方法:可以执行任何SQL语句,一般用于执行DDL语句。
  2. update(sqlStr, 参数列表) 方法:用于执行新增、修改、删除等语句。
  3. batchUpdate() 方法:用于执行批处理相关语句,batchUpdate方法第二参数是一个元素为 Object[] 数组类型的 List 集合。
  4. query() 方法及 queryForXXX() 方法:用于执行查询相关语句,查询结果为基本数据类型或者是单个对象一般使用。
  5. call() 方法:用于执行存储过程、函数相关语句。

DataSource (数据源)

参考资料:DataSource数据源_datasource数据源配置-CSDN博客

介绍

javax.sql.DataSource 是一个接口,用于建立和管理与数据库的连接(一个DataSource代表一个数据库)。它提供了一种标准的方式来访问和操作关系型数据库(各个数据库厂商都要遵循这种标准)。

DataSource 接口用于获取和管理数据库连接的对象。它提供了从连接池中获取连接、释放连接、管理连接状态等功能。它是与底层数据库进行通信的基础组件。

通常,应用程序使用 DataSource 接口的实现类,这些实现类是由数据库供应商或第三方库提供的。在Java中,常见的 DataSource 实现类包括 org.apache.commons.dbcp2.BasicDataSource、org.apache.tomcat.jdbc.pool.DataSource、com.zaxxer.hikari.HikariDataSource 等。

HikariDataSource

Hikari是一款非常强大,高效,并且号称"史上最快连接池"。并且在Springboot2.0之后(已经包含,不需要引入依赖),采用的默认数据库连接池就是Hikari。在yml中的配置:

自动装配

Spring Boot 提供了自动配置的机制,可以根据项目的配置和依赖,自动创建并配置 DataSource 对象。当项目中引入了 MybatisPlus 相关的依赖时,Spring Boot 会检测到这一情况,并自动配置一个 DataSource 对象。

自动配置的过程中,Spring Boot 会根据应用程序配置文件(application.yml)中的数据库相关配置,如数据库URL、用户名、密码等信息,来创建一个 DataSource 对象(默认提供的是HikariDataSource)。同时,它会根据依赖的数据库驱动自动加载适当的驱动程序。

当我们需要在代码中使用 DataSource 对象时,可以通过使用 @Autowired 注解或者构造函数注入的方式,将它注入到我们的服务类或其他需要的地方。

上面的代码,DataSourceConfig类的作用是在项目启动的时候根据特定的前缀加载不同的数据源,再根据构建好的数据源创建不同的JDBC。

DataSourceProperties

‌ DataSourceProperties是Spring Boot提供的一个类,用于配置数据源的属性,包括数据库的URL、用户名和密码等。通过DataSourceProperties,Spring Boot可以轻松创建DataSource实例,从而连接到不同的数据库‌‌。DataSourceProperties的主要属性:

  1. ‌url:数据库的连接地址。
  2. ‌username‌:用于登录数据库的用户名。
  3. ‌password‌:用于登录数据库的密码。
  4. ‌driverClassName‌:数据库驱动的类名,默认com.mysql.jdbc.Driver。
  5. type:数据源类型,默认com.zaxxer.hikari.HikariDataSource。

快速创建DataSource: return dataSourceProperties.initializeDataSourceBuilder().build();

多数据源配置

配置多数据源,首先要禁调 spring boot 默认的单数据源配置,然后在 application.yml 里自定义配置多个数据源,最后创建基于注解的数据源配置类。

  1. spring boot 默认情况下,它会读取 application.yml 文件的 spring.datasource.* 属性,并自动配置单数据源,需要通过以下方式禁止这一默认行为,具体如下:
  2. 然后在 application.yml 里配置多个 db 数据源,名字无所谓,只需要不和 spring 默认的配置参数重名就可以。
  3. 最后创建基于注解@Configuration的数据源配置类。

AbstractRoutingDataSource (动态数据源)

参考资料:

【正确姿势】完全理解 Spring AbstractRoutingDataSource 实现动态(多)数据源切换(避免踩坑)_abstractroutingdatasource 用法-CSDN博客

‌ AbstractRoutingDataSource‌是Spring框架提供的一个抽象类,它实现了DataSouce接口,用于实现数据源的动态路由。动态路由意味着可以根据某些条件或上下文来决定具体使用哪个数据源,而不需要每次手动切换。这个类的核心功能是根据用户定义的规则,动态决定在特定的操作中使用哪个数据源‌。

使用场景

AbstractRoutingDataSource适用于以下几种场景:

  1. ‌多租户架构‌:不同的租户需要访问不同的数据库或数据源。
  2. ‌读写分离‌:写操作使用主库,读操作使用从库,以提高系统性能和可扩展性。
  3. ‌多数据源‌:根据业务逻辑动态选择使用不同的数据库‌。

实现原理

通过重写AbstractRoutingDataSource的determineCurrentLookupKey()方法来实现动态数据源的选择。该方法需要根据上下文条件返回数据源的标识符。使用ThreadLocal存储当前线程需要使用数据源的标识,并在AOP(面向切面编程)中根据注解设置当前线程的数据源标识‌。

配置和使用方法

  1. ‌添加依赖‌:在pom.xml中引入Spring Boot和mybatis的相关依赖。
  2. ‌配置数据源‌:在配置文件中定义多个数据源,并在启动时初始化这些数据源。
  3. ‌重写实现determineCurrentLookupKey()方法‌:在自定义的DynamicDataSource实现类中重写determineCurrentLookupKey()方法,根据业务逻辑返回相应的数据源标识符。
  4. ‌使用ThreadLocal存储数据源标识‌:在业务逻辑中,使用ThreadLocal存储当前线程需要使用的数据源标识。
  5. ‌AOP拦截‌:通过AOP拦截特定方法,根据注解设置当前线程的数据源标识‌。

切换失败的问题

Spring多数据源切换失败,发现与事务相关_springboot 开启事务后数据源切换失败-CSDN博客

SqlSession (Sql会话)

介绍

‌ SqlSession‌是MyBatis框架中的一个核心概念,它是对JDBC连接的封装,简化了数据库操作。SqlSession提供了执行SQL语句、管理事务等功能,使得开发者可以以面向对象的方式操作数据库,而不需要直接编写大量的JDBC代码。

作用和特性

  1. ‌封装JDBC连接‌:SqlSession封装了JDBC的Connection对象,简化了数据库操作。通过SqlSession,开发者可以直接执行已映射的SQL语句,而不需要关心底层的JDBC细节‌。
  2. ‌事务管理‌:SqlSession负责管理事务,包括事务的提交和回滚。它提供了开启事务、提交事务和回滚事务的方法,使得事务控制更加方便‌。
  3. ‌单线程‌:SqlSession是一个单线程对象,确保了线程安全。在同一个线程中,SqlSession是唯一的,避免了多线程下的并发问题‌。

DefaultSqlSession

DefaultSqlSession是MyBatis中的核心类,主要负责执行SQL语句和管理事务。它通过持有Executor对象来执行具体的SQL操作,Executor中包含Transaction和StatementHandler,通过这些组件完成数据库操作‌。DefaultSqlSession还负责管理一级缓存和二级缓存,使用HashMap存储数据,但HashMap本身不是线程安全的,这也是DefaultSqlSession线程不安全的原因之一‌。

在与Spring集成时,通常会使用SqlSessionTemplate来代替DefaultSqlSession。SqlSessionTemplate实现了SqlSession接口,通过代理DefaultSqlSession来完成数据库操作。由于DefaultSqlSession的线程不安全性,Spring提供了一个全局唯一的SqlSessionTemplate对象来完成其功能,从而避免了线程安全问题‌。

SqlSessionTemplate

介绍

‌ SqlSessionTemplate‌继承自SqlSession接口,是MyBatis为了接入Spring框架而提供的一个Bean,主要用于管理MyBatis的SqlSession,并且它是线程安全的。SqlSessionTemplate通过TransactionSynchronizationManager中的ThreadLocal保存线程对应的SqlSession,从而实现session的线程安全‌。

SqlSessionTemplate里面有4个类变量:

|-------------------------|--------------------------------|--------------------------------------------------------------------------------------|
| 字段 | 类型 | 描述 |
| sqlSessionFactory | SqlSessionFactory | session工厂 |
| executorType | ExecutorType | Executor的类型:SIMPLE, REUSE, BATCH |
| sqlSessionProxy | SqlSession | SqlSession代理对象,注册了SqlSessionInterceptor反射处理器,实际上的方法调用都是通过SqlSessionInterceptor反射实现的。 |
| exceptionTranslator | PersistenceExceptionTranslator | Spring提供的接口,用于处理持久化框架的异常 |

特性

  • ‌线程安全‌:SqlSessionTemplate是线程安全的,可以在多个线程中共享同一个实例。这是因为SqlSessionTemplate内部使用的SqlSession是线程安全的‌。
  • ‌简化操作‌:通过使用SqlSessionTemplate,开发者可以以一种声明式的方式来执行SQL操作,减少重复代码,避免常见的错误,如忘记关闭SqlSession。
  • ‌异常处理‌:SqlSessionTemplate提供了一种统一的异常处理机制,将异常包装成DataAccessException,使得开发者可以更容易地处理异常‌。
  • ‌事务管理‌:SqlSessionTemplate参与事务管理,自动进行事务的提交和回滚‌。

SqlSessionFactory (会话工厂)

介绍

SqlSessionFactory 是 MyBatis 框架中的核心接口之一,其能力就是打开一个SqlSession,而且重载了很多不同的参数,你可以改变这些参数自定义会话过程中的一些默认行为。

​​​​​​​

在 MyBatis 中,SqlSession 是用于执行数据库操作的接口。它提供了许多方法来执行 SQL 语句,包括查询、插入、更新和删除等操作。

SqlSessionFactory的实现有两种,DefaultSqlSessionFactory和SqlSessionManager。

与DataSource关系

SqlSessionFactory与DataSource关系:

  1. SqlSessionFactory 需要一个有效的 DataSource来创建和管理 SqlSession。
  2. 通过 SqlSessionFactory 的openSession() 方法,可以从DataSource 获取数据库连接,并创建一个 SqlSession 对象,以便进行数据库操作。
  3. SqlSessionFactory 使用DataSource 提供的连接,执行 SQL 语句并将结果返回给调用方。
  4. SqlSessionFactory 可以配置多个DataSource,以支持多数据源的情况。(可以通过@MapperScan注解指定要mapper接口所在的包basePackages = xx和数据源工厂sqlSessionFactoryRef = x))

DefaultSqlSessionFactory

DefaultSqlSessionFactory 是 SqlSessionFactory 的一个默认实现类,我们将其设计为基于 Configuration 对象生成 SqlSession 对象,并管理事务和资源。

  • Configuration对象:包含了 MyBatis 的所有配置信息,是 SqlSessionFactory 创建 SqlSession 的核心依赖。
  • openSession方法:根据配置创建一个新的 SqlSession 对象,并管理事务。

SqlSessionManager

SqlSessionManager本身实现了SqlSessionFactory, SqlSession两个接口,所以本身能够构建Sqlsession和使用Sqlsesion声明的CURD相关的查询方法。SqlSessionManager不能通过构造器进行实例化,只能通过newInstance()方法进行实例化,事实上,在newInstance()方法中调用了SqlSessionFactoryBuilder.build()方法实例化了一个DefaultSqlsessionFactory。然后再使用构造器进行实例化。

SqlSessionFactoryBean

​​​​​​​

SqlSessionFactoryBean是一个FactoryBean,它负责创建和配置SqlSessionFactory对象。使用SqlSessionFactoryBean的好处之一是它允许您在创建SqlSessionFactory之前进行更多的自定义配置。

通过SqlSessionFactoryBean,可以设置以下配置选项:

  1. 数据源配置:可以将DataSource对象设置为SqlSessionFactoryBean的属性,以便它知道从哪里获取数据库连接。
  2. MyBatis配置:您可以通过设置Configuration对象的属性来自定义MyBatis的配置,如mapper文件的位置、类型别名等。
  3. 插件配置:您可以添加自定义的MyBatis插件来扩展和修改MyBatis的功能。
  4. 其他配置选项:SqlSessionFactoryBean还提供了其他一些配置选项,如设置映射器路径、数据库方言等。

总结:SqlSessionFactoryBean提供了一种灵活和可扩展的方式来创建SqlSessionFactory,可以更方便地集成和配置MyBatis与Spring框架的其他特性,如事务管理、AOP等。

相关推荐
一只叫煤球的猫5 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9655 小时前
tcp/ip 中的多路复用
后端
bobz9655 小时前
tls ingress 简单记录
后端
皮皮林5516 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友6 小时前
什么是OpenSSL
后端·安全·程序员
bobz9657 小时前
mcp 直接操作浏览器
后端
前端小张同学9 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook9 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康10 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在10 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net