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

相关文章

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3