基于注解的声明式事务

使用方法

1. 添加相关jar包或依赖——数据源、数据库驱动、mysql或spring-jdbc等,这里以spring-jdbc为例;

2. 数据库连接参数,一般单独写在properties或yaml配置文件中;

3. 编写数据库访问层组件(dao)和业务逻辑层组件(service),且在service层需要事务管理的方法上加@Transactional注解;

4. 在容器中注册数据源、数据库操作模板、事务管理器,以及步骤3中的组件;

5. 在容器中开启基于事务的注解,即在容器配置类上加@EnableTransactionManagement注解。

 

注:

1. 在容器配置类(即添加了@Configuration注解的类)中,可以在一个方法中获取其他方法注册的bean实例,方法有两种

    |-在参数列表中直接接收;

    |-在方法体中调用另一个方法,这种情况下多次调用容器配置类中的方法,并不会反复创建实例,而是从容器中获取实例;

2. 如果service层使用了try/catch语句,会导致发生异常时之前的操作无法回滚,为了避免这种情况,需要在catch字句中加TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 表示捕获异常后仍然回滚。

 

下面是一个使用spring-jdbc访问数据库的事务demo

pom文件

<!--spring数据库操作模板-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.1.16.RELEASE</version>
</dependency>
<!--数据源,由于只是测试事务的demo,用的c3p0-->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.4</version>
</dependency>
<!--数据库驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.15</version>
</dependency>

 

数据库配置文件

jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.username=root
jdbc.password=123456
jdbc.driverClass=com.mysql.jdbc.Driver

 

容器配置类

/**
 * 容器配置类
 * 用于测试事务
 */
@Configuration
@ComponentScan(basePackages = {"cn.monolog.service", "cn.monolog.dao"})
@PropertySource(value = "classpath:/datasource.properties")
@EnableTransactionManagement
public class TxBeanConfig {

    //从配置文件中注入属性
    @Value(value = "${jdbc.username}")
    private String username;
    @Value(value = "${jdbc.password}")
    private String password;
    @Value(value = "${jdbc.driverClass}")
    private String driverClass;
    @Value(value = "${jdbc.url}")
    private String url;

    //注册数据源
    @Bean(name = "dataSource")
    public DataSource dataSource() throws PropertyVetoException {
        //创建数据源实例
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();

        //属性注入
        comboPooledDataSource.setUser(this.username);
        comboPooledDataSource.setPassword(this.password);
        comboPooledDataSource.setDriverClass(this.driverClass);
        comboPooledDataSource.setJdbcUrl(this.url);

        //返回
        return comboPooledDataSource;
    }

    //注册spring的数据库操作模板
    @Bean(name = "jdbcTemplate")
    public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
        //从容器中获取数据源
        // --注:spring对配置类(即加了@Configuration的类)有特殊处理,
        // 当多次调用注册方法时,并不是每次都会创建新bean,而是会从容器中获取bean
        DataSource dataSource = this.dataSource();

        //创建模板
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        //返回模板
        return jdbcTemplate;
    }

    //注册事务管理器
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager() throws PropertyVetoException {
        //从容器中获取数据源
        DataSource dataSource = this.dataSource();

        //创建事务管理器实例
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);

        //返回
        return  dataSourceTransactionManager;
    }
}

 

数据库访问层组件


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

/** * 数据库访问层组件 * 用于测试事务 */ @Repository public class VariationDao { //从容器中自动注入spring数据库操作模板 @Autowired @Qualifier("jdbcTemplate") private JdbcTemplate jdbcTemplate; /** * 创建一条数据 */ public void create(String staffId, Integer alloted) { //编写sql语句 String sql = "insert into c_variation_config (staff_id, alloted) values (?, ?)"; //执行sql语句 this.jdbcTemplate.update(sql, staffId, alloted); } }

 

业务逻辑层组件

import cn.monolog.dao.VariationDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 业务逻辑层组件
 * 用于测试事务
 */
@Service
public class VariationService {

    //从容器中自动注入dao层组件
    @Autowired
    @Qualifier("variationDao")
    private VariationDao variationDao;

    /**
     * 创建一条数据
     */
    @Transactional
    public void create(String staffId, Integer alloted) {
        //执行
        this.variationDao.create(staffId, alloted);
        //手动制造异常
        int i = 10 / 0;
    }
}

 

原文地址:https://www.cnblogs.com/dubhlinn/p/10731884.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


连接数据库的方式:第一种方式:ODBC:开放数据库连接是微软公司开放服务结构中有关数据库的一个组成部分,是数据库访问接口标准。ODBC是基于C语言实现的。提供了语言和数据库进行交互的一致性的接口,便于语言和数据库通信以及语言对数据库的各种操作。第二种方式:JDBC(本章重点)在Java中,
JDBCRequest 使用VariableNamesmysql:数据库连接池对象variousname:设置的变量名称 如何使用该变量a_#、b_#、c_#、d_#:代表行数a_1:第1行、第1列b_2:第2行、第2列
 1.JDBCDBC(JavaDataBaseConnectivity):Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。JDBC是数据库与Java代码的桥梁。JDBC中定义了操作数据库的各种接口和类型:增删改基本操作:(1)获取连接:Connectionconnection=
1.需要jar包的支持:java.sqljavax.sqlmysql-conneter-java...连接驱动(必须要导入)<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></depend
1.简介Activiti是一个业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,易扩展的可执行流程语言框架。在Java工作流引擎中可谓是主流,我们的项目也是使用的这个框架进行流程相关的开发。与流程息息相关的就是我们的流程定义BPMN文件,包含有一系列
1.JDBC体系系统一组规范:接口JDBC接口(API)包括两个层次:面向应用的API:JavaAPI,抽象接口,供应用开发人员使用(连接数据库,执行SQL语句,获得结果)面向数据库的API:JavaDriverAPI,供开发商开发数据库驱动程序JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接
原文链接JDBC一般指Java数据库连接(JavaDatabaseConnectivity)api应用程序接口(API):可以调用或者使用类/接口/方法等去完成某个目标。API制定的类/方法可以做什么。API由开发人员调用。spi服务提供接口(SPI):需要继承或实现某些类/接口/方法等去完成某个目标。SPI告诉你
spring.shardingsphere.datasource.names=#省略数据源配置,请参考用法#标准分表配置spring.shardingsphere.rules.sharding.tables.<table-name>.actual-data-nodes=#描述数据源名称和实际表,分隔符为点,多个数据节点用逗号分隔,支持内联表达式。Absent表示仅对数据库进行分片
1问题Cannotloaddriverclass:com.mysql.cj.jdbc.Driver 2解决方案2.1已解决2.1.1首先,去查看项目中MySQL的版本如果找不到,说明可能还没有jdbc驱动,需要配置或者引入       (1)如果是直接引用的jar包,就去lib文件夹中查看,后缀是版
JDBC一、JDBC概述什么是JDBC?JDBC是使用Java语言操作关系型数据库的一套API。这套API是交由不同的数据库厂商实现的。我们利用JDBC编写操作数据库的代码,真正执行的是各个数据库的实现类(驱动)。全称:(JavaDataBaseConnectivity)Java数据库连接。JDBC的好处面向接口编
说明:/*需要引入依赖<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.18</version></dependency>*/代码:objec
1.概要在“配置元件”中添加“JDBCConnectionConfiguration”。配置如下图: 2.重点:配置人大金仓数据库连接下面着重介绍人大金仓数据库连接配置:DatabaseURL输入:jdbc:kingbase8://192.132.180.101:54321/hj_yc   (备注:应输入 jdbc:kingbase8://IP:
JDBC概念:JavaDataBaseconnectivityJava数据库连接,Java语言操作数据库JDBc本质∶其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
Mybatis核心配置文件习惯上命名mybatis-config.xml,整合Spring之后,整个配置文件可以省略核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息标签顺序顺序出错会报错propertiessettingstypeAliasestypeHandlersobjectFactoryobjectWrapperFa
JDBC1.概念:JavaDataBaseConnectivityJava数据库连接,Java语言操作数据库JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
  1.出现这个问题的原因 :在安装mysql的时候时区设置的不正确,mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用+8:00格式使用的数据库是MySQL,没有指定MySQL驱动版本的情况下它自动依赖的驱动是8.0.12很高的版本,这是由于数据库和系统时区差异所造成的,在jdbc连
一、环境准备1.数据库创建2个库2个表:xdclass_shop_order_0product_order_0product_order_1ad_configproduct_order_item_0product_order_item_1xdclass_shop_order_1product_order_0product_order_1ad_configproduct_order_item_0product_order_item_1数据
编写配置文件(application.yml)spring:datasource:username:rootpassword:123456url:jdbc:mysql://localhost:3306/mybatis?useUnicode&characterEncoding=utf-8driver-class-name:com.mysql.cj.jdbc.Driver测试连接@SpringBootTestclassSprin
结构图pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http:/
MySql链接url参数详解 jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]... 常用的几个较为重要的参数: 参数名称参数说明缺省值最低版本要求 user 数据库用户名(用于连接数据库) 所有版本passWord用户密码(用于连接