Spring 선언적 트랜잭션: 환경 구성, 구성 파일 작성 및 두 테이블 수정을 위한 테스트(아이디어)

환경 빌드

데이터 소스: c3p0
데이터베이스: Mysql8
데이터 테이블: 두 개의 테이블이면 충분하며, sql은 수정 작업용입니다.

메이븐 프로젝트 만들기

여기에 이미지 설명 삽입

관련 의존성 가져오기

 <!--导入Spring的核心jar包-->
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.2.7.RELEASE</version>
      </dependency>

      <!--c3p0管理数据库连接池-->
      <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
      <dependency>
          <groupId>com.mchange</groupId>
          <artifactId>c3p0</artifactId>
          <version>0.9.5.2</version>
      </dependency>

      <!--数据库-->
      <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.13</version>
      </dependency>

        <!--spring的jdbc-->
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.2.7.RELEASE</version>
      </dependency>
      <!--spring的orm包-->
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-orm</artifactId>
          <version>5.2.7.RELEASE</version>
      </dependency>


      <!--spring的事务相关-->
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>5.2.7.RELEASE</version>
      </dependency>

      <!--与junit整合-->
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>5.2.7.RELEASE</version>
          <scope>test</scope>
      </dependency>

      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

dao 레이어 쓰기

두 개의 dao 메서드는 두 개의 테이블을 운영합니다.

package com.xzy.dao;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class ScoreDao {
    
    
    @Autowired
    JdbcTemplate jdbcTemplate;

    public void updateScore(){
    
    
        String sql = "UPDATE score SET scoreid=1,scorenum=88 WHERE scoreid=1";
        jdbcTemplate.update(sql);
    }
}
import org.springframework.stereotype.Repository;

@Repository
public class StuDao {
    
    

    @Autowired
    JdbcTemplate jdbcTemplate;

    public void updateStu(){
    
    
        String sql = "UPDATE stu SET stuname ='hello',stuage=15 WHERE stuid=1";
        jdbcTemplate.update(sql);
    }
}

구성 파일 작성

jdbcConfig 구성 파일

user=root
password=*******
jdbcUrl=jdbc:mysql://localhost:3306/XXX?characterEncoding=UTF8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
driverClass=com.mysql.cj.jdbc.Driver

Spring의 applicationContext.xml 구성 파일

<?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" xmlns:tx="http://www.springframework.org/schema/tx"
       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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:component-scan base-package="com.xzy"></context:component-scan>
    <!--引入外部的配置文件-->
    <context:property-placeholder location="classpath:jdbcConfig.properties"/>
    <bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${user}"/>
        <property name="password" value="${password}"/>
        <property name="jdbcUrl" value="${jdbcUrl}"/>
        <property name="driverClass" value="${driverClass}"/>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="pooledDataSource"/>
    </bean>

    <!--配置事务-->
    <!--1:配置事务管理器让其管理事务-->
    <bean id="sourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--控制数据源-->
        <property name="dataSource" ref="pooledDataSource"></property>
    </bean>
    <!--2:开启基于注解的事务模式-->
    <tx:annotation-driven transaction-manager="sourceTransactionManager"/>
    <!--3:给事务方法添加注解-->

</beans>

서비스 레이어 작성

서비스 방법

package com.xzy.service;

import com.xzy.dao.ScoreDao;
import com.xzy.dao.StuDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class Transactions {
    
    
    @Autowired
    StuDao stuDao;
    @Autowired
    ScoreDao scoreDao;
    //注解 @Transactional 标注这个方法是一个事务方法
    
    /**@Transactional 的属性
     * isolation            事务的隔离级别
     * propagation          事务的传播行为
     *
     * rollbackFor          哪些异常事务可以不回滚
     * rollbackForClassName 
     *
     * noRollbackFor        哪些异常事务需要回滚
     * noRollbackForClassName
     * 
     * readOnly-boolean     设置只读
     * timeOut              超出指定时长停止事务并回滚
     */
    @Transactional
    public void updateTwoTable(){
    
    
        stuDao.updateStu();
        scoreDao.updateScore();
    }
}

이 시점에서 서비스에서 주석으로 표시된 메서드는 이미 트랜잭션을 추가했으며 성공하거나 실패합니다.

추천

출처blog.csdn.net/weixin_42643321/article/details/107601146