当前位置: 首页 > article >正文

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

目录

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编程式事务

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

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加入依赖

<?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

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的配置文件

<?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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-jdbc.xml")
public class jdbcTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public 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查询一条数据为实体类对象

@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集合

@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查询单行单列的值

@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 标签,并添加配置:

<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.kler.cn/a/298909.html

相关文章:

  • 重拾设计模式--外观模式
  • 大数据操作实验一
  • 写作词汇积累:纰漏、坎肩、颠三倒四、隔阂
  • SPL06 基于stm32F103 HAL库驱动(软件模拟IIC)
  • Android获取sim卡频段信息
  • 入侵他人电脑,实现远程控制(待补充)
  • 间隙锁在其他数据库管理系统中的类似实现
  • 发现用 Go 写桌面程序真的太爽了...
  • Proteus仿真综合实例(1)
  • 使用 JAXB 将内嵌的JAVA对象转换为 xml文件
  • MIT6.824 课程-MapReduce
  • vue3如何创建多环境变量
  • Anti-honeypot - 自动识别Web蜜罐Chrome插件,附下载链接
  • 英文站外链如何建设?
  • 启动程序时遇到0xc000007b应用程序无法正常启动问题
  • Mongodb 4.2.25 安装教程
  • QDY421F-16P-25液氨不锈钢液动紧急切断阀
  • 若依项目后台启动报错: [网关异常处理]、503
  • c++指针和引用专题
  • Matlab程序练习
  • PCIe NVMe SSD 上电初始化全流程
  • Elasticsearch-数据迁移elasticdump
  • go--知识点
  • 大学生必看干货!分享5款ai写毕业论文软件
  • SQL 支持使用 GROUP BY多个列
  • 利用高德+ArcGIS优雅获取任何感兴趣的矢量边界