从头开始学Spring—06初识声明式事务

news/2024/12/21 23:35:43/

目录

1.概念

1.1编程式事务

1.2声明式事务

2.JdbcTemplate

2.1准备工作

2.1.1加入依赖

2.1.2创建jdbc.properties

2.1.3配置Spring的配置文件

2.2测试

2.2.1在测试类装配JdbcTemplate

2.2.2测试增删改功能

2.2.3查询一条数据为实体类对象

2.2.4查询多条数据为一个list集合

2.2.5查询单行单列的值

3.基于XML的声明式事务

3.1场景模拟

3.2修改Spring配置文件


 

1.概念

1.1编程式事务

事务功能的相关操作全部通过自己编写代码来实现:

java">Connection conn = ...;
try {// 开启事务:关闭事务的自动提交conn.setAutoCommit(false);// 核心操作// 提交事务conn.commit();
}catch(Exception e){// 回滚事务conn.rollBack();
}finally{// 释放数据库连接conn.close();
}

 

1.2声明式事务

2.JdbcTemplate

2.1准备工作

2.1.1加入依赖

java"><?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId><artifactId>spring06</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.1</version></dependency><!-- Spring 持久化层支持jar包 --><!-- Spring 在执行持久化层操作、与持久化层技术进行整合过程中,需要使用orm、jdbc、tx三个jar包 --><!-- 导入 orm 包就可以通过 Maven 的依赖传递性把其他两个也导入 --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>5.3.1</version></dependency><!-- Spring 测试相关 --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.1</version></dependency><!-- junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- 数据源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.31</version></dependency></dependencies></project>

 

2.1.2创建jdbc.properties

java">jdbc.user=root
jdbc.password=ykxykx
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
jdbc.driver=com.mysql.cj.jdbc.Driver

2.1.3配置Spring的配置文件

java"><?xml version="1.0" encoding="UTF-8"?>
<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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!-- 导入外部属性文件 --><context:property-placeholder location="classpath:jdbc.properties" /><!-- 配置数据源 --><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="url" value="${jdbc.url}"/><property name="driverClassName" value="${jdbc.driver}"/><property name="username" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></bean><!-- 配置 JdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!-- 装配数据源 --><property name="dataSource" ref="druidDataSource"/></bean></beans>

2.2测试

2.2.1在测试类装配JdbcTemplate

java">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-jdbc.xml")
public class jdbcTest {@Autowiredprivate JdbcTemplate jdbcTemplate;@Testpublic void test(){String sql = "insert into t_user values(null,?,?,?,?,?)";int result = jdbcTemplate.update(sql, "ykx2", "112233",23, "男","123@qq.com");System.out.println(result);}}

2.2.2测试增删改功能

2.2.3查询一条数据为实体类对象

java">@Test
//查询一条数据为一个实体类对象public void testSelectEmpById(){String sql = "select * from t_emp where id = ?";Emp emp = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Emp.class), 1);System.out.println(emp);}

2.2.4查询多条数据为一个list集合

java">@Test
//查询多条数据为一个list集合
public void testSelectList(){String sql = "select * from t_emp";List<Emp> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Emp.class));list.forEach(emp -> System.out.println(emp));
}

2.2.5查询单行单列的值

java">@Test
//查询单行单列的值
public void selectCount(){String sql = "select count(id) from t_emp";Integer count = jdbcTemplate.queryForObject(sql, Integer.class);System.out.println(count);
}

3.基于XML的声明式事务

3.1场景模拟

参考基于注解的声明式事务

3.2修改Spring配置文件

将Spring配置文件中去掉tx:annotation-driven 标签,并添加配置:

java"><aop:config>
<!-- 配置事务通知和切入点表达式 -->
<aop:advisor advice-ref="txAdvice" pointcut="execution(*
com.atguigu.spring.tx.xml.service.impl.*.*(..))"></aop:advisor>
</aop:config>
<!-- tx:advice标签:配置事务通知 -->
<!-- id属性:给事务通知标签设置唯一标识,便于引用 -->
<!-- transaction-manager属性:关联事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- tx:method标签:配置具体的事务方法 -->
<!-- name属性:指定方法名,可以使用星号代表多个字符 -->
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<!-- read-only属性:设置只读属性 -->
<!-- rollback-for属性:设置回滚的异常 -->
<!-- no-rollback-for属性:设置不回滚的异常 -->
<!-- isolation属性:设置事务的隔离级别 -->
<!-- timeout属性:设置事务的超时属性 -->
<!-- propagation属性:设置事务的传播行为 -->
<tx:method name="save*" read-only="false" rollback
for="java.lang.Exception" propagation="REQUIRES_NEW"/>
<tx:method name="update*" read-only="false" rollback
for="java.lang.Exception" propagation="REQUIRES_NEW"/>
<tx:method name="delete*" read-only="false" rollback
for="java.lang.Exception" propagation="REQUIRES_NEW"/>
</tx:attributes>
</tx:advice>

内容来源于黑马程序员SSM课程的笔记,仅作为学习笔记参考

 


http://www.ppmy.cn/news/1526574.html

相关文章

c语言 —— 结构变量

1.结构变量的定义 类型和变量是不同的概念,只能对变量进行赋值、存取或运算操作,而不能对一个类型进行这些操作。因此在声明了结构类型后,还需要定义结构变量,以便在程序中引用它。结构变量和其他变量一样,必须先定义后使用,定义方法有以下3种: (1)先定义结构类型,再定…

智能门锁为何选择ESP32-S3芯片?低功耗高性能方案,启明云端乐鑫代理商

在科技日新月异的今天&#xff0c;家庭安全不再仅仅依赖于传统的锁和钥匙。智能门锁&#xff0c;作为智能家居系统的前沿产品&#xff0c;正逐渐走进千家万户&#xff0c;成为家庭安全的高科技守护者。 智能门锁是一种利用现代科技手段&#xff0c;通过电子化、信息化技术改进…

Qt QSerialPort数据发送和接收DataComm

文章目录 Qt QSerialPort数据发送和接收DataComm2.添加 Qt Serial Port 模块3.实例源码 Qt QSerialPort数据发送和接收DataComm Qt 框架的Qt Serial Port 模块提供了访问串口的基本功能&#xff0c;包括串口通信参数配置和数据读写&#xff0c;使用 Qt Serial Port 模块就可以…

当函数参数传递方式为按引用传递时,为什么实参必须是变量(数组名或数组元素)?看完这篇文章你就明白了

目录 1. 函数参数传递的两种方式 2. 为什么必须是变量而不能是表达式或常量呢&#xff1f; 3. 举例 1. 函数参数传递的两种方式 传值方式&#xff1a;是将实参的值传递给形参&#xff0c;因此实参可以是表达式(或常量)&#xff0c;也可以是变量(或数组元素)&#xff0c;这种…

八股文知识汇总(常考)

八股文知识汇总&#xff08;常考&#xff09; 语言特性相关 JAVA知识 - JDK动态代理为什么只能代理有接口的类&#xff1f; 说一下对象创建的过程&#xff1f;ThreadLocal是什么&#xff1f;他的实现原理是什么&#xff1f;ThreadLocal会出现内存泄露吗&#xff1f;String、…

HarmonyOS Next鸿蒙NDK使用示例

创建一个Native C项目 跟普通项目相比&#xff0c;主要区别是多了一个cpp文件夹、oh-package.json5中的dependencies引入还有build-profile.json5中的externalNativeOptions配置&#xff0c;abiFilters是支持的CPU架构&#xff0c;目前移动端项目只支持arm64-v8a、x86_64两种。…

C#笔记8 线程是什么?多线程怎么实现和操作?

这和前面的学习内容可能有点不太连贯&#xff0c;但是呢我们一般来说的学习就是遇到什么困难就去学习什么&#xff0c;这也是为什么看那些循序渐进的教程虽然学的很饱满&#xff0c;但是我们有时会学了前面忘记了后面&#xff0c;或者对某个板块理解不深&#xff0c;乃至于写代…

Ready Go

本文首发在这里 温馨提示 XX年&#xff0c;指的是20XX年&#xff0c;后跟以前、以后之类&#xff0c;均包含本数链接较多&#xff0c;只是想言之有物&#xff0c;已拒绝相同外链&#xff0c;仅看关心的即可已尽量只引用自己的东西&#xff0c;16年后仓库(11/13)&#xff0c;2…