Spring 如何使用注解实现事务管理呢?

2023-11-04

转自:

Spring 如何使用注解实现事务管理呢?

下文讲述Spring使用注解使用事务管理的方法分享

实现思路:
使用 Annotation 需进行以下设置
1.在 Spring 容器中注册驱动 
<tx:annotation-driven transaction-manager="txManager" />
2.在需要使用事务的业务类或者方法中添加注解 @Transactional,
 并配置 @Transactional 的参数
@Transactional参数如下所示: 
propagation:设置事务的传播行为 
isolation:设置事务的隔离级别 
readOnly:设置是读写事务还是只读事务 
timeout:事务超时事件(单位:s) 

例:

   使用IDEA创建一个事务的项目

  1. 创建 SpringDemo 项目
  2. 在 src 目录下创建 com.java265 包
  3. 导入 Spring 相关 JAR 包及 mysql-connector-java.x.x.x.jar 包
  4. 在 com.java265 包下创建 User、UserDao、UserDaoImpl、Beans.xml 和 MainApp
  5. 运行 SpringDemo 项目

User 类

package com.java265;
public class User {
    private int id;
    private String name;
    private int age;
    public User() {
    }
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    
    // 省略set和get方法
}

UserDao类

package com.java265;
import java.util.List;
public interface UserDao {
    /**
     * 初始化User表
     */
    void createUserTable();
    /**
     * 保存用户
     */
    void saveUser(User user);
    /**
     * 查询用户
     */
    List<User> listUser();
}

UserDaoImpl 类

package com.java265;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
public class UserDaoImpl implements UserDao {
    private JdbcTemplate jdbcTemplate;
    private UserDao userDao;
    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    public UserDao getUserDao() {
        return userDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void setDataSource(DataSource datasource) {
        this.jdbcTemplate = new JdbcTemplate(datasource);
    }
    @Override
    public void createUserTable() {
        this.jdbcTemplate.execute("CREATE TABLE `user` (\r\n" + "  `id` int(11) NOT NULL AUTO_INCREMENT,\r\n"
                + "  `name` varchar(50) DEFAULT NULL,\r\n" + "  `age` int(4) DEFAULT NULL,\r\n"
                + "  PRIMARY KEY (`id`)\r\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
    }
    @Override
    public void saveUser(User user) {
        try {
            this.jdbcTemplate.update("INSERT INTO USER(NAME,age) VALUES (?,?)", user.getName(), user.getAge());
            this.jdbcTemplate.update("INSERT INTO USER(NAME,age) VALUES (?,?)", "google", 16);
            throw new RuntimeException("simulate Error condition");
        } catch (Exception e) {
            System.out.println("Error in creating record, rolling back");
            throw e;
        }
    }
    @Override
    public List<User> listUser() {
        List<User> users = this.jdbcTemplate.query("SELECT NAME,age FROM USER", new RowMapper<User>() {
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                user.setName(rs.getString("name"));
                user.setAge(rs.getInt("age"));
                return user;
            }
        });
        return users;
    }
}
@Transactional 注解的参数之间可以使用“,”进行分隔

Beans.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:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    <!-- 配置数据源 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!--数据库驱动 -->
        <property name="driverClassName"
            value="com.mysql.jdbc.Driver" />
        <!--连接数据库的url -->
        <property name="url" value="jdbc:mysql://localhost/test" />
        <!--连接数据库的用户名 -->
        <property name="username" value="root" />
        <!--连接数据库的密码 -->
        <property name="password" value="root" />
    </bean>
    <!-- 配置事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="jdbcTemplate"
        class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="userdao" class="com.java265.UserDaoImpl">
        <property name="dataSource" ref="dataSource" />
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>
    <!-- 注册事务管理驱动 -->
    <tx:annotation-driven
        transaction-manager="transactionManager" />
</beans>

MainApp 类

package com.java265;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
        UserDao dao = (UserDao) ctx.getBean("userdao");
        dao.createUserTable();
        dao.saveUser(new User("bianchengbang", 12));
        dao.saveUser(new User("baidu", 18));
        List users = dao.listUser();
        for (User user : users) {
            System.out.println("姓名:" + user.getName() + "\t年龄:" + user.getAge());
        }
    }
}

运行结果---
Error in creating record, rolling back
Exception in thread "main" java.lang.RuntimeException: simulate Error condition
...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 如何使用注解实现事务管理呢? 的相关文章

随机推荐

  • docker 镜像容器导入导出、查看日志、拷贝文件命令

    1 本地文件拷贝到docker 容器中 参考 docker cp root pcl pcl 1 8 1 tar gz 7ff95b333e12 docker cp root lib64 a 7ff95b333e12 2 docker从容器里
  • 蓝桥杯决赛真题——国王的遗产

    标题 国王的遗产 X国是个小国 国王K有6个儿子 在临终前 K国王立下遗嘱 国王的一批牛作为遗产要分给他的6个儿子 其中 大儿子分1 4 二儿子1 5 三儿子1 6 直到小儿子分1 9 牛是活的 不能把一头牛切开分 最后还剩下11头牛 分给
  • 5种开源虚拟化技术推荐

    zz http www oschina net news 14907 5 opensource virtualization soft 论坛 http bbs chinaunix net forum 283 1 html 虚拟化现在已经成为
  • 力扣977-有序数组的平方

    有序数组的平方链接 给你一个按 非递减顺序 排序的整数数组 nums 返回 每个数字的平方 组成的新数组 要求也按 非递减顺序 排序 示例 1 输入 nums 4 1 0 3 10 输出 0 1 9 16 100 解释 平方后 数组变为 1
  • python开发工程师考试_Python开发工程师丨网易游戏

    本期导读 计科校友 榜样说 vol 15 方向很重要 实践出真知 蔡钰莹 Python开发工程师丨网易游戏 软件工程师 广州合明软件科技有限公司 前端开发工程师 广东中科慈航信息科技有限公司 网易游戏 公司简历 网易 NASDAQ NTES
  • SpringSecurity跨域问题,配置了相关配置还是报错

    跨域问题基础配置 跨域的本质是响应头问题 只要加上下述的响应头即可解决跨域 下述1 配置跨域中的代码是通过aop来实现该功能的一种方式 1 配置跨域 正常的跨域配置 Component public class CORSIntercepto
  • 【uni-app项目如何引入 uView组件库】

    uniapp项目引入uView组件库 一 uView官方文档 二 公司项目中引入并使用uView 一 uView官方文档 uView官方文档 二 公司项目中引入并使用uView 第一步 在公司创建完成uniapp项目后引入uView 第二步
  • ESP8266-NodeMCU——使用U8g2库点亮OLED

    前言 U8g2是嵌入式设备的单色图形库 U8g2库提供了大量绘制函数 简单引用即可实现想要的效果 并且适用大部分屏幕驱动 一 软件准备 1 Arduino IDE 2 u8g2库文件 点击跳转 如果在IDE里不能下载就从这下载 解压后放去库
  • C++中同类的不同对象可以相互访问成员(包括私有成员)

    如拷贝 复制 构造函数中 include using namespace std class Data public Data int a x a Data const Data r 调用别对象的函数 x r x void s cout l
  • 【c++】理解模板类型推导

    理解模板类型推导 函数模板 第一种情况 ParamType 是个非通用的引用或者是一个指针 第二种情况 ParamType 是个通用的引用 Universal Reference 第三种情况 ParamType 既不是指针也不是引用 数组参
  • 浅谈Hybrid技术的设计与实现第第2章

    前言 接上文 浅谈Hybrid技术的设计与实现 阅读本文前 建议阅读这个先 上文说了很多关于Hybrid的概要设计 可以算得上大而全 有说明有demo有代码 对于想接触Hybrid的朋友来说应该有一定帮助 但是对于进阶的朋友可能就不太满足了
  • Linux 终端颜色,界面着色

    环境 Ubuntu Liniux终端着色分2块 1 提示符及命令行和输出颜色 2 显示目录和文件 ls命令 颜色 一 提示符及命令行颜色设置 设置PS1命令 可立即生效 e后面为颜色设置部分 32 40m 32为前景色 40为背景色 m 不
  • pandas用均值填充nan_pandas dataframe 填充 NaN(填补缺失值)的方法 fillna 函数使用说明...

    在基于 pandas 的 DataFrame 对象进行数据处理时 如样本特征的缺省值处理 可以使用 DataFrame 对象的 fillna 函数进行填充 同样可以针对指定的列进行填补空值 单列的操作是调用 Series 对象的 filln
  • Unity-赛车Demo

    using UnityEngine using System Collections public class CarDrive MonoBehaviour public WheelCollider wheelColLF public Wh
  • 软件测试---弹出窗口

    视频地址 第五课时 https pan baidu com s 1gfLVC2n alert 弹出窗口 Alert Should Be Present Get Alert Message confirm 弹出窗口 Choose Cancel
  • [masmplus]初次使用报external symbol _start 是配置问题

    初次使用masmplus 其中在 codesg segment 使用了 start 标记 并在end处标明了 end start 但是默认的masmplus 会提示 start 为 不认识的 external symbol 如下图 那怎么办
  • 计算机系统的多级层次结构

  • Flutter的路由router-页面跳转

    文章目录 概念介绍 基本路由 Basic Routing 跳转到某个页面 弹出页面 命名路由 Named Routing 第三方路由管理库 Third Party Routing Libraries Android原生的路由 Intent
  • 两条线段是否相交原理及C++实现

    step 1 快速排斥 如上图1 2所示 AB的最大X坐标 如果小于PQ的最小X坐标 则不相交 CD和UV判断同理 换成 坐标即可 step 2 利用向量叉乘判断 亦称跨立方法 2D 叉乘可把 2D 点看作 3D 的点 z 轴的值为 0 套
  • Spring 如何使用注解实现事务管理呢?

    转自 Spring 如何使用注解实现事务管理呢 下文讲述Spring使用注解使用事务管理的方法分享 实现思路 使用 Annotation 需进行以下设置 1 在 Spring 容器中注册驱动