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集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd