Spring的数据库操作和事务管理

Spring JDBC:简化数据库操作的强大工具! 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 阅读详情

一.概述

spring的数据库操作:spring是一个优秀的一站式框架,其中涵盖了很多持久化框架模板对象,如JDBC,hibernate,mybatis对象模板,极大地简化了数据库操作。

事务:表示逻辑上的一组操作,这组操作要么一起成功要么一起失败。最经典的就是银行转账业务,假设甲转一百块给乙,在转账过程中,可能发生各种异常,若此时没有事务,可能会发生甲的钱少了,而乙的钱没有增加的事件。

二.动态代理手写一个AOP的事务管理器(spring管理事务的机制)

假设现在在项目中不引入spring框架,我们来自己手写一个面向切面的事务管理机制。事务管理应该放在service,dao层只负责数据库的增删改查,假设我们现在有一系列service代码(如UserService,CustomerService,MoneyService),要是在每一个service单独实现事务管理,显然过于复杂,不符合编程中代码复用的思想。那么我们可以把这些重复的事务管理操作抽取到一个工厂类中,工厂负责生产Service,并根据是否有注解,区分这个Service是否要进行事务处理。我们可以用动态代理技术对Service进行代理,对需要进行事务处理的Service的方法进行增强。最终实现Service层的事务自动管理。

public <T extends Service> T getService(Class<T> clazz){//把泛型限制在Service的子类中
		try{
			//--把所有Service都写在配置文件中,根据配置文件创建具体的Service
			String infName = clazz.getSimpleName();
			String implName = prop.getProperty(infName);
			final T service = (T) Class.forName(implName).newInstance();
			//动态代理生成代理后的Service,实现事务管理自动化
			//--为了实现AOP,生成service代理,根据注解确定在Service方法执行之前和之后做一些操作,比如:事务管理/记录日志/细粒度权限控制....
			T proxyService =  (T) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces()
				 , new InvocationHandler(){
				
					//根据注解控制事务
					public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
						
						if(method.isAnnotationPresent(Tran.class)){//如果有注解,则管理事务:
							try{
								TransactionManager.startTran();//--自定义事务管理器,开启事务
								
								Object obj = method.invoke(service, args);//--真正执行方法
								
								TransactionManager.commit();//--提交事务
								return obj;
							}catch (InvocationTargetException e) {
								TransactionManager.rollback();//--回滚事务
								throw new RuntimeException(e.getTargetException());
							} catch (Exception e) {
								TransactionManager.rollback();//--回滚事务
								throw new RuntimeException(e);
							}finally{
								TransactionManager.release();//--释放资源
							}
						}else{//如果没有注解,则不管理事务,直接执行方法
							return method.invoke(service, args);
						}
					}
				 
			 });
			 
			return proxyService;
			
		}catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
三.spring中的事务操作解析

spring提供了很多主流的持久化框架模板,包括最基础的JDBC,ORM框架hibernate,mybatis等。具体模板类对应如下:

下面以JDBC模板为例,解析spring持久化模板类的使用。

1.导入必要的jar包

以mysql为例,故要导入mysql驱动包

spring中jdbc操作相关包

spring事务操作相关包

2.编写测试类:spring持久化模板使用非常简单,获得模板对象后直接就可以对数据库进行增删改查

@Test
// JDBC 模板的基本使用:
public void demo1(){
//注册数据库配置
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring_crc");
dataSource.setUsername("root");
dataSource.setPassword("123");

//获得模板类后就可以直接操作数据库
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("insert into account values (null,?,?)", " crc
",10000d);
}
3.每一次使用都要配置数据库显然过于麻烦,故把数据库的配置交给spring管理,在主配置文件中配置如下bean,并使用c3p0代替原来的数据源

<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
 <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
 <property name="url" value="jdbc:mysql:///spring_crc"/>
 <property name="username" value="root"/>
 <property name="password" value="123"/>
 </bean>
4.还可以把模板类对象交给spring管理,由spring创建模板类对象

<! -- 配置 JDBC 模板 对象-->
 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 <property name="dataSource" ref="dataSource"/>
 </bean>

5.此时JDBC模板的操作可以简化成如下形式

@RunWith(SpringJUnit4ClassRunner. class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo3 {
@Resource(name="jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Test
// 插入操作
public void demo1(){
jdbcTemplate.update("insert into account values (null,?,?)", " crc
",10000d);
}
@Test
// 修改操作
public void demo2(){
jdbcTemplate.update("update account set name=?,money =? where id = ?", "
hello",10000d,5);
}
@Test
// 删除操作
public void demo3(){
jdbcTemplate.update("delete from account where id = ?", 5);
}
@Test
// 查询一条记录
public void demo4(){
Account account = jdbcTemplate.queryForObject("select * from account where
id = ?", new MyRowMapper(), 1);
System. out.println(account);
}

小结:至此,JDBC的简单使用全部完毕,我们可以把数据库配置和模板对象创建交给spring管理,最后只需要

调用简单的API就可以完成增删改查工作。


四.spring中的事务管理(主要解析声明式事务)

1.事务的基本说明

事务的四个特性

原子性 :强调事务的不可分割.
一致性 :事务的执行的前后数据的完整性保持一致.
隔离性 :一个事务执行的过程中,不应该受到其他事务的干扰
持久性 :事务一旦结束,数据就持久到数据库

   事务的安全性问题

脏读 :一个事务读到了另一个事务的未提交的数据
不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.
虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

事务的隔离级别

未提交读 :脏读,不可重复读,虚读都有可能发生
已提交读 :避免脏读。但是不可重复读和虚读有可能发生
可重复读 :避免脏读和不可重复读.但是虚读有可能发生.
串行化的 :避免以上所有读问题.
其中,

Mysql 默认:可重复读
Oracle 默认:读已提交



2.spring管理事务的对象

org.springframework.jdbc.datasource. DataSourceTransactionManager 使用 Spring JDBC 或 iBatis 进行持久

化数据时使用
org.springframework.orm.hibernate3. HibernateTransactionManager 使用Hibernate 版本进行持久化数据时使用

3.spring中可以定制的事务信息

* 隔离级别
* 传播行为
* 超时信息
* 是否只读

其中事务的传播行为分为以下几种

* 保证同一个事务中
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
* 保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务

PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行

4.spring中管理事务的两种方式
spring中管理方式的方式可分为两种:编程式和声明式事务。由于编程式事务使用较少(不符合spring习惯),故接下来重点阐述

声明式事务,声明式事务又可以分为XML配置方式和注解配置方式。在配置之前首先应该明确,spring中管理事务对象的依赖关系

如图:

现在以配置JDBC的事务管理为例,分别演示用XML方式和注解方式配置声明式事务。如下:


XML方式

步骤1.导入AOP开发相关的包,因为XML方式配置就是基于AOP开发思想的

aop 联盟.jar; Spring-aop.jar; aspectJ.jar; spring-aspects.jar

步骤2.配置事务管理器,注意上图,JDBC事务管理器依赖于DataSource存在,故在配置中需要体现此种关系

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource"/>
 </bean>
步骤3.配置事务的通知

<! -- 配置事务的增强 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
 	<! --
	方法中可以配置的几个属性
	isolation="DEFAULT" 隔离级别
	propagation="REQUIRED" 传播行为
	read-only="false" 只读
	timeout="-1" 过期时间
	rollback-for="" -Exception
	no-rollback-for="" +Exception
	-->
	<!-- 配置需要事务管理的方法,以转账方法为例-->
 		<tx:method name="transfer" propagation="REQUIRED"/>
	 </tx:attributes>
</tx:advice>

步骤4.配置将通知织入目标

<aop:config>
<!--表示把事务织入到AccountServiceIml类中,所有以tranfer开头的方法中-->
 <aop:pointcut expression="execution(*
com.cai.transaction.AccountServiceImpl.transfer(..))" id="pointcut1"/>
 <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
 </aop:config>

注解方式

步骤1,导包和开启事务管理与XML方式一致,不再累述。

步骤2.开启注解管理事务

<! -- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

步骤3.在使用的类中添加一个注解@Transactional

小结:对比以上两种方式,可以得出一个结论,XML方式配置比较麻烦,但是比较统一,可以一次性解决问题。注解配置方式比较简单,

且比较灵活,可以在比较少事务管理的时候使用注解方式。在对项目要求严谨时,使用XML方式。


五.总结

本博客一开始先使用动态代理技术手写了一个AOP的事务管理对象,让人大致明白了spring内部是

怎么进行事务管理的。然后简单介绍了spring中数据库操作的模板类及其API,最后使用两种方式

配置事务管理操作。通过这样一套流程,就可以使用spring进行完整的数据库操作了。









Spring JDBC:简化数据库操作的魔法! 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 阅读详情

相关推荐

Spring与Hibernate集成实现声明式事务管理

本文还有配套的精品资源,点击获取 简介:本文深入探讨了如何集成Spring和Hibernate框架,特别关注于声明式事务配置与使用。Spring框架通过DI和AOP功能简化Java应用开发,而Hibernate作为一个ORM框架,简化了数据库操作。两者集成后,开发者可以利用Spring的事务管理能力,通过配置文件或注解的方式定义事务边界,提升开发效率和代码质量。文章通过实例...

weixin_42594419的博客 1440

Spring事务管理与数据库隔离级别的关系(Spring+mysql)

之前写过一篇文章《数据库隔离级别(mysql+Spring)与性能分析 》,里面很多问题写的不是很专业,也不是很有逻辑性,现在重新整理一下,希望对大家有帮助。 这部分通过两天时间反复的做实验总算是理清了其中的关系,其中有些部分可能略有偏差,但是相信大家仔细读的话会对对这部分的理解带来很大的帮助。 先来总体说一下我对这个问题的理解,用一句话概括:数据库是可以控制事务的传播和隔离级别的,Spr...

各研发管理 666

自动驾驶仿真:基于Carsim开发的加速度请求模型

1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方式将请求加速度转换成对应的节气门开度与主缸压力传给动力学软件进行闭环控制。

zataji的博客 6912

Spring事务管理详解

Spring事务管理详解

一个普本码农奋斗史 8万+

23.网工入门篇--------介绍一下园区网典型组网架构及案例实践

园区网典型组网架构主要分为小型、中型、大型三种类型,以下是详细介绍及相关案例实践:

qq_31450765的博客 964

电磁场仿真软件:CST Studio Suite_(25).案例分析与实践

在电磁场仿真中,材料属性的设置至关重要。通过API,您可以轻松地设置和修改材料属性,以适应不同的仿真需求。通过以上案例分析和实践,您已经学会了如何在CST Studio Suite中进行二次开发。自动化仿真流程:批量创建和运行仿真项目、优化设计参数、生成报告。自定义仿真设置:设置材料属性、边界条件和激励源。数据处理与分析:读取仿真结果、数据可视化和数据导出。高级脚本开发:多线程仿真、集成机器学习和云仿真。这些技能将帮助您更高效地进行电磁场仿真,提高设计质量和工作效率。

kkchenjj的博客 1383

Spring的事务管理和数据库事务相关知识

1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱。  比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱;然后ATM出1000元钱。这两个步骤必须是要么都执行要么都不执行。如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元;如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元。所以,如果一个步骤成功

Learning 1万+

Android 10.0 kenel中修改rom系统内部存储的大小

在10.0的系统rom产品开发定制中,在对一些产品开发中的配置需求方面,由于在产品后续订单中,有些产品是出口的,但是硬件方面已经定板,时间比较仓促,所以 就需要软件方面在rom内部存储的大小方面作假,修改rom真实的大小容量,所以就需要在kenel驱动部分来修改这部分的值最好了,接下来分析下计算rom容量的 相关代码,然后做出修改

安卓兼职framework和app工程师的博客 1403

Spring系列之事务处理

事务处理在应用程序中起着至关重要的作用。本篇博客将进入Spring的事务处理学习。下面,首先我们来简单回想一下与事务有关的一些概念。 【事务】     所谓事务,就是一系列必须成功的操作,只要有一步操作失败,所以其他步骤都将要撤销。当所有的步骤都执行完成后,则该事务提交成功。由于操作中的某一个步骤失败,导致所有的步骤都没有提交,则事务必须回滚,即回到事务前的状态。 【Spring事务概述】

Dream it Possible 1033

[Dify实战] 在 Dify 官网环境使用 File Translator 插件实现 Office 文档翻译(支持 DOCX/XLSX/PPTX)

摘要:Dify平台的FileTranslator插件可实现Office文档一键翻译,保留原格式和结构。该插件支持Word、Excel、PPT等文件格式,无需额外密钥,直接复用Dify配置的大模型。安装后,用户可在Workflow中调用插件,设置目标语言等参数完成翻译。输出文件自动命名,保留原格式。适用于跨国协作、海外营销等场景,显著提升多语言办公效率。该插件简化了文档翻译流程,是企业用户和开发者的实用工具。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 544

高精度地图数据的结构

本文是个人在学习高精度地图数据结构的心得,主要是描述高精度地图的几层数据结构以及元数据信息。

qq_40664711的博客 5573

spring的使用():spring在对数据库操作的事务管理

一、事务管理的简介 二、为什么要出现事务管理 三、场景还原 四、事务管理的解决方法

调皮的写代码 671

YOLOv13多分支融合机制+SE注意机制 RepVGGBlock_OREPA架构 map提升4.89,召回率提升8.66

本文提出了一种改进的YOLOv13目标检测模型,通过引入RepVGGOREPA模块和重参数化技术,显著提升了模型性能。实验结果表明,采用RepVGGBlock后,mAP提升4.89,召回率提升8.66%。文章详细介绍了模型移植过程,包括创建YOLOv13-REPVGGOREPA配置文件、修改任务处理代码和模块初始化文件,并提供了完整的OREPA模块实现代码。该模块通过多尺度特征融合和SE注意力机制,实现了训练时的丰富表征能力和推理时的高效计算,为YOLO系列模型提供了新的优化思路。

FJN110的博客 2650

Spring事务管理 数据库连接池流程原理分析_spring 数据库操作 事务 连接

小编整理不易,对这份感兴趣劳烦帮忙。

2401_84002730的博客 923

优化算法 | 赏金猎人优化算法(Bounty Hunter Optimizer, BHO)及其在多无人机移动边缘计算与路径规划中的应用(附matlab源代码)

移动边缘计算(Mobile Edge Computing, MEC)通过将计算资源下沉至网络边缘,有效解决了物联网终端设备计算能力不足与能耗受限的问题。无人机(Unmanned Aerial Vehicle, UAV)因其高机动性、灵活部署和广域覆盖等优势,被广泛用作MEC的移动服务器平台。多无人机辅助MEC系统的核心优化问题在于:如何在满足任务处理时延约束和无人机能量限制的前提下,联合优化无人机的三维飞行轨迹、任务卸载决策与计算资源分配,以最小化系统总能耗或最大化任务完成效率。

尘世冰封的专栏 223

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring知识梳理(4)--数据库操作、事务管理

《JdbcTemplate实现curd数据库操作》 模板(template) 创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。 1.spring框架 一站式框架 针对Javaee三层结构,每一层都有相应的解决技术 2.spring对不同的持久化技术 都进行了封装 在dao层使用的JdbcTemplate

秦怀卓的博客 424

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

spring拦截器中的数据库操作和事务管理(aop log )

       在service中自己执行的方法抛出异常之后添加自己的拦截器,保存所抛出的异常信息到数据库表中;        但保存异常信息的这些操作通过调用一个服务类的方法来执行,这个方法也在spring事务管理拦截器的管理之下,那么这个记录方法需要在另一个事务中进行,而不是与被拦截方法在同一个事务中,不然如果被拦截方法抛出异常需要回滚时,所作的记录也会被回滚;     具体的解决方法:...

white_lily的专栏 516

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

spring拦截器中的事务管理(一)

探讨一下spring拦截器中的数据库操作和事务管理。 大家知道spring中的事务管理是通过AOP代理来实现的,对被代理对象的每个方法进行拦截,在方法执行前启动事务,方法执行完后根据是否有异常和异常的种类进行提交或回滚。 如果要在方法执行前或后或抛出异常后加上一个自己的拦截器,或者一个环绕拦截器,在拦截器中执行一些操作,比如执行一些数据库操作,记录一些信息,这些操作通过调用一个服务类的方法

zbyluxzing的专栏 4462

Spring整合hibernate4:事务管理

Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTransaction,commit,这些都是重复的工作,我们可以把事务管理部分交给spring框架完成。   配置事务(xml方式) 使用spring管理事务后在dao中不再需要调用beginTransaction和commit,也不需要调用ses

dns007 6124

Spring事务管理与JdbcTemplate实战

PlatformTransactionManager是Spring事务管理的核心接口,它定义了事务的基本操作,如开始事务、提交事务和回滚事务等。在实际开发中,事务管理是确保数据一致性的关键环节。它通过高度抽象的PlatformTransactionManager接口,将底层的事务机制封装起来,使得开发者可以专注于业务逻辑的实现,而无需过多关心事务的具体实现细节。在上述代码中,我们首先尝试插入两个订单项,其中一个订单项的数量超出了数据库表中定义的范围(QTY必须在1到100之间),这将导致事务回滚。

m0_74337424的博客 1347

Spring Boot快速入门---(三)spring boot的快速连接数据库之spring data jpa以及事务管理

五、数据库操作  1.引入依赖 2.在配置文件中添加信息 3.Girl类的书写 4.GirlRepository继承JpaRepository 5.GirlController的实现,可通过Postman来模拟请求package com.lcz; import org.springframework.beans.factory.annotation.Autowired; import org.s...

Mind_programmonkey的博客 549

Mybatis事务如何跟Spring结合到一起?

在Java Web开发中,MyBatis和Spring是两个常用的框架,它们可以有效地结合在一起,提供强大的数据库事务管理功能。在本文中,我们将从数据库事务特性和Spring事务管理源码两个角度来分析MyBatis事务如何与Spring结合到一起的原理。

隐风的博客 2173

Spring5 学习总结—JdbcTemplate,事务管理

JdbcTemplate(概念和准备) 1.什么是JdbcTemplate 1.1 Spring框架对JDBC进行封装,使用 JdbcTemplate 方便实现对数据库操作 2.准备工作 2.1 导入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</art...

m0_52901132的博客 2379

[Spring]事务管理(数据源)配置

JavaEE开发框架-Spring-概述与实现(下) 导包 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instan...

JunsIr的技术栈 903

spring的jdbcTemplate,c3p0,事务管理

简介: 1  spring的jdbcTemplate操作:  (1): 实现crud操作 --&gt;增加,修改,删除,调用模板update方法 --&gt;查询某个值的时候,调用queryForObject方法 ----自己实现类封装数据 --&gt;查询对象,调用queryForObject方法 --&gt;查询list集合,调用query方法 2 spring配置连接池 (...

github_37217206的博客 464
上一篇: spring中的AOP编程思想详解
下一篇: 权限控制框架shiro与spring整合详解
wonabi
博客等级 码龄11年 14粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值