spring framework入门(12):spring事务处理

2024-05-15 18:48

本文主要是介绍spring framework入门(12):spring事务处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参照:https://blog.csdn.net/chuangxin/article/details/80921704
试验代码:https://download.csdn.net/download/u010476739/11518163
试验目的:

  • spring-jdbc使用方法
  • spring-jdbc事务实现编程式事务管理的两种方法:
    1:transactionManager+JDBCTemplate
    2:transactionTemplate
  • spring-jdbc事务实现声明式事务管理的两种方法
    1:xml,在spring配置文件中配置好切点和事务通知
    2:注解,在spring配置文件中启动事务驱动注解,在事务方法上添加@Transactional

试验环境:

  • win10家庭版64位
  • postgresql10
  • springframework 4.2.4.release

一、试验jdbc操作和编程式事务的两种书写方式

1.1 准备数据库demo新建表Student

CREATE TABLE Student(ID  SERIAL PRIMARY Key,NAME VARCHAR(20) NOT NULL,AGE  INT NOT NULL
); 

1.2 pom文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jackletter</groupId><artifactId>spring-jdbc-tran1</artifactId><version>0.0.1-SNAPSHOT</version><name>this is name</name><description>this is desc</description><properties><spring.version>4.2.4.RELEASE</spring.version><postgresql.version>42.2.6</postgresql.version></properties><dependencies><!-- Spring Core --><!-- http://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><!-- Spring Context --><!-- http://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>${postgresql.version}</version></dependency>		<dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.6.0</version></dependency></dependencies>
</project>

1.3 sping配置文件(applicationContext.xml)

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><bean id="dataSource"class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName"value="org.postgresql.Driver" /><property name="url"value="jdbc:postgresql://localhost:5432/demo" /><property name="username" value="postgres" /><property name="password" value="123456" /><property name="initialSize" value="5" /></bean><bean id="JDBCTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><constructor-arg><ref bean="dataSource" /></constructor-arg></bean><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><bean id="transactionTemplate"class="org.springframework.transaction.support.TransactionTemplate"><property name="transactionManager" ref="transactionManager"></property></bean><context:component-scanbase-package="com.jackletter" />
</beans>

其实从这个上面可以看出spring-jdbc关于事务的主要对象
在这里插入图片描述

1.4 java代码

Student.java:

package com.jackletter.entity;public class Student {private Integer age;private String name;private Integer id;public void setAge(Integer age) {this.age = age;}public Integer getAge() {return age;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setId(Integer id) {this.id = id;}public Integer getId() {return id;}
}

StudentMapper.java:

package bean;import java.sql.ResultSet;
import java.sql.SQLException;import org.springframework.jdbc.core.RowMapper;import com.jackletter.entity.Student;public class StudentMapper implements RowMapper<Student> {public Student mapRow(ResultSet rs, int rowNum) throws SQLException {Student student = new Student();student.setId(rs.getInt("id"));student.setName(rs.getString("name"));student.setAge(rs.getInt("age"));return student;}
}

StudentDAO.java:

package com.jackletter.dao;import java.util.List;import javax.annotation.Resource;import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;import com.jackletter.entity.Student;import bean.StudentMapper;@Component
public class StudentDAO {@Resourceprivate JdbcTemplate jdbcTemplateObject;@Resourceprivate PlatformTransactionManager transactionManager;@Resourceprivate TransactionTemplate transactionTemplate;public void create(String name, Integer age) {String SQL = "insert into Student (name, age) values (?, ?)";jdbcTemplateObject.update(SQL, name, age);System.out.println("Created Record Name = " + name + " Age = " + age);return;}public Student getStudent(Integer id) {String SQL = "select * from Student where id = ?";Student student = jdbcTemplateObject.queryForObject(SQL, new Object[] { id }, new StudentMapper());return student;}public List<Student> listStudents() {String SQL = "select * from Student";List<Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());return students;}public void delete(Integer id) {String SQL = "delete from Student where id = ?";jdbcTemplateObject.update(SQL, id);System.out.println("Deleted Record with ID = " + id);return;}public void update(Integer id, Integer age) {String SQL = "update Student set age = ? where id = ?";jdbcTemplateObject.update(SQL, age, id);System.out.println("Updated Record with ID = " + id);return;}public void opTX() {DefaultTransactionDefinition define = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(define);System.out.println("withTX start...");try {jdbcTemplateObject.update("insert into Student(NAME,AGE) values(?,?)", "测试事务", "20");jdbcTemplateObject.update("insert into Student(NAME,AGE) values(?,?)", "测试事务", "哈哈");transactionManager.commit(status);} catch (Exception ex) {transactionManager.rollback(status);System.out.println(ex);}}@SuppressWarnings({ "unchecked", "rawtypes" })public void opTXTemplate() {transactionTemplate.execute(new TransactionCallback() {@Overridepublic Object doInTransaction(TransactionStatus status) {jdbcTemplateObject.update("insert into Student(NAME,AGE) values(?,?)", "测试事务", "20");jdbcTemplateObject.update("insert into Student(NAME,AGE) values(?,?)", "测试事务", "哈哈");return null;}});}}

App.java:

package com.jackletter;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.jackletter.dao.StudentDAO;public class App {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");StudentDAO studentDao = (StudentDAO) context.getBean(StudentDAO.class);// 測試jdbc普通的增刪 改查
//		System.out.println("------Records Creation--------");
//		studentDao.create("Zara", 11);
//		studentDao.create("Nuha", 2);
//		studentDao.create("Ayan", 15);
//
//		System.out.println("------Listing Multiple Records--------");
//		List<Student> students = studentDao.listStudents();
//		for (Student record : students) {
//			System.out.print("ID : " + record.getId());
//			System.out.print(", Name : " + record.getName());
//			System.out.println(", Age : " + record.getAge());
//		}
//
//		System.out.println("----Updating Record with ID = 2 -----");
//		studentDao.update(2, 20);
//
//		System.out.println("----Listing Record with ID = 2 -----");
//		Student student = studentDao.getStudent(2);
//		System.out.print("ID : " + student.getId());
//		System.out.print(", Name : " + student.getName());
//		System.out.println(", Age : " + student.getAge());//studentDao.opTX();studentDao.opTXTemplate();}
}

1.5 直接运行查看数据库的数据和控制台输出即可

二、试验spring-jdbc声明式事务的xml方式

2.1 环境

  • 数据库采用上个试验的
  • pom文件增加aspectj依赖
  • spring配置文件中增加aop配置(事务的切点、通知),删除transactionTemplate内容(用不到)
  • 精简StudentDao.java代码、App代码

2.2 改变了的文件

pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jackletter</groupId><artifactId>spring-jdbc-tran2</artifactId><version>0.0.1-SNAPSHOT</version><name>this is name</name><description>this is desc</description><properties><spring.version>4.2.4.RELEASE</spring.version><postgresql.version>42.2.6</postgresql.version></properties><dependencies><!-- Spring Core --><!-- http://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><!-- Spring Context --><!-- http://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>${postgresql.version}</version></dependency>		<dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.10</version></dependency></dependencies>
</project>

applicationContext.xml:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><bean id="dataSource"class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName"value="org.postgresql.Driver" /><property name="url"value="jdbc:postgresql://localhost:5432/demo" /><property name="username" value="postgres" /><property name="password" value="123456" /><property name="initialSize" value="5" /></bean><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><bean id="JDBCTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><constructor-arg><ref bean="dataSource" /></constructor-arg></bean><tx:advice id="txAdvice"transaction-manager="transactionManager"><tx:attributes><tx:method name="Transaction*"></tx:method></tx:attributes></tx:advice><aop:config><aop:pointcut id="pt"expression="execution(* com.jackletter.dao.*.*(..))"></aop:pointcut><aop:advisor advice-ref="txAdvice" pointcut-ref="pt"></aop:advisor></aop:config><context:component-scanbase-package="com.jackletter" />
</beans>

StudentDao:

package com.jackletter.dao;import javax.annotation.Resource;import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;@Component
public class StudentDAO {@Resourceprivate JdbcTemplate jdbcTemplateObject;public void TransactionOp() {jdbcTemplateObject.update("insert into Student(NAME,AGE) values(?,?)", "测试事务", 20);jdbcTemplateObject.update("insert into Student(NAME,AGE) values(?,?)", "测试事务", "哈哈");}}

App.java:

package com.jackletter;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.jackletter.dao.StudentDAO;public class App {public static void main(String[] args) {@SuppressWarnings("resource")ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");StudentDAO studentDao = (StudentDAO) context.getBean(StudentDAO.class);studentDao.TransactionOp();}
}

2.3 直接运行后观察控制台输出和数据库的数据变化

三、试验spring-jdbc声明式事务的注解方式

3.1 环境

  • 数据库使用上个试验的
  • pom文件不变
  • spring配置文件删除上个试验的通知、切点配置,增加事务的注解驱动
  • StudentDao代码修改为使用注解方式使用事务

3.2 改变了的文件

application.xml:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><bean id="dataSource"class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName"value="org.postgresql.Driver" /><property name="url"value="jdbc:postgresql://localhost:5432/demo" /><property name="username" value="postgres" /><property name="password" value="123456" /><property name="initialSize" value="5" /></bean><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><bean id="JDBCTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><constructor-arg><ref bean="dataSource" /></constructor-arg></bean><tx:annotation-driventransaction-manager="transactionManager" /><context:component-scanbase-package="com.jackletter" />
</beans>

StudentDao.java:

package com.jackletter.dao;import javax.annotation.Resource;import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;@Component
public class StudentDAO {@Resourceprivate JdbcTemplate jdbcTemplateObject;@Transactionalpublic void TransactionOp() {jdbcTemplateObject.update("insert into Student(NAME,AGE) values(?,?)", "测试事务", 20);jdbcTemplateObject.update("insert into Student(NAME,AGE) values(?,?)", "测试事务", "哈哈");}}

3.3 直接运行后观察控制台输出和数据库的数据变化

这篇关于spring framework入门(12):spring事务处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992629

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor