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


    转自:

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

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

    实现思路:
    使用 Annotation 需进行以下设置
    1.在 Spring 容器中注册驱动 
    
    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 类

    1. package com.java265;
    2. public class User {
    3. private int id;
    4. private String name;
    5. private int age;
    6. public User() {
    7. }
    8. public User(String name, Integer age) {
    9. this.name = name;
    10. this.age = age;
    11. }
    12. // 省略set和get方法
    13. }

    UserDao类

    1. package com.java265;
    2. import java.util.List;
    3. public interface UserDao {
    4. /**
    5. * 初始化User表
    6. */
    7. void createUserTable();
    8. /**
    9. * 保存用户
    10. */
    11. void saveUser(User user);
    12. /**
    13. * 查询用户
    14. */
    15. List listUser();
    16. }

    UserDaoImpl 类

    1. package com.java265;
    2. import java.sql.ResultSet;
    3. import java.sql.SQLException;
    4. import java.util.List;
    5. import javax.sql.DataSource;
    6. import org.springframework.jdbc.core.JdbcTemplate;
    7. import org.springframework.jdbc.core.RowMapper;
    8. import org.springframework.transaction.annotation.Isolation;
    9. import org.springframework.transaction.annotation.Propagation;
    10. import org.springframework.transaction.annotation.Transactional;
    11. @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
    12. public class UserDaoImpl implements UserDao {
    13. private JdbcTemplate jdbcTemplate;
    14. private UserDao userDao;
    15. public JdbcTemplate getJdbcTemplate() {
    16. return jdbcTemplate;
    17. }
    18. public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    19. this.jdbcTemplate = jdbcTemplate;
    20. }
    21. public UserDao getUserDao() {
    22. return userDao;
    23. }
    24. public void setUserDao(UserDao userDao) {
    25. this.userDao = userDao;
    26. }
    27. public void setDataSource(DataSource datasource) {
    28. this.jdbcTemplate = new JdbcTemplate(datasource);
    29. }
    30. @Override
    31. public void createUserTable() {
    32. this.jdbcTemplate.execute("CREATE TABLE `user` (\r\n" + " `id` int(11) NOT NULL AUTO_INCREMENT,\r\n"
    33. + " `name` varchar(50) DEFAULT NULL,\r\n" + " `age` int(4) DEFAULT NULL,\r\n"
    34. + " PRIMARY KEY (`id`)\r\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
    35. }
    36. @Override
    37. public void saveUser(User user) {
    38. try {
    39. this.jdbcTemplate.update("INSERT INTO USER(NAME,age) VALUES (?,?)", user.getName(), user.getAge());
    40. this.jdbcTemplate.update("INSERT INTO USER(NAME,age) VALUES (?,?)", "google", 16);
    41. throw new RuntimeException("simulate Error condition");
    42. } catch (Exception e) {
    43. System.out.println("Error in creating record, rolling back");
    44. throw e;
    45. }
    46. }
    47. @Override
    48. public List listUser() {
    49. List users = this.jdbcTemplate.query("SELECT NAME,age FROM USER", new RowMapper() {
    50. public User mapRow(ResultSet rs, int rowNum) throws SQLException {
    51. User user = new User();
    52. user.setName(rs.getString("name"));
    53. user.setAge(rs.getInt("age"));
    54. return user;
    55. }
    56. });
    57. return users;
    58. }
    59. }
    @Transactional 注解的参数之间可以使用“,”进行分隔
    

    Beans.xml

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4.     xmlns:tx="http://www.springframework.org/schema/tx"
    5.     xmlns:aop="http://www.springframework.org/schema/aop"
    6.     xsi:schemaLocation="http://www.springframework.org/schema/beans
    7.        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    8.        http://www.springframework.org/schema/tx
    9.        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    10.        http://www.springframework.org/schema/aop
    11.        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    12.    
    13.     <bean id="dataSource"
    14.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    15.        
    16.         <property name="driverClassName"
    17.             value="com.mysql.jdbc.Driver" />
    18.        
    19.         <property name="url" value="jdbc:mysql://localhost/test" />
    20.        
    21.         <property name="username" value="root" />
    22.        
    23.         <property name="password" value="root" />
    24.     bean>
    25.    
    26.     <bean id="transactionManager"
    27.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    28.         <property name="dataSource" ref="dataSource" />
    29.     bean>
    30.     <bean id="jdbcTemplate"
    31.         class="org.springframework.jdbc.core.JdbcTemplate">
    32.         <property name="dataSource" ref="dataSource" />
    33.     bean>
    34.     <bean id="userdao" class="com.java265.UserDaoImpl">
    35.         <property name="dataSource" ref="dataSource" />
    36.         <property name="jdbcTemplate" ref="jdbcTemplate" />
    37.     bean>
    38.    
    39.     <tx:annotation-driven
    40.         transaction-manager="transactionManager" />
    41. beans>

    MainApp 类

    1. package com.java265;
    2. import java.util.List;
    3. import org.springframework.context.ApplicationContext;
    4. import org.springframework.context.support.ClassPathXmlApplicationContext;
    5. public class MainApp {
    6. public static void main(String[] args) {
    7. ApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
    8. UserDao dao = (UserDao) ctx.getBean("userdao");
    9. dao.createUserTable();
    10. dao.saveUser(new User("bianchengbang", 12));
    11. dao.saveUser(new User("baidu", 18));
    12. List users = dao.listUser();
    13. for (User user : users) {
    14. System.out.println("姓名:" + user.getName() + "\t年龄:" + user.getAge());
    15. }
    16. }
    17. }

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

  • 相关阅读:
    HotSpot JVM 中的应用程序/动态类数据共享
    机器学习_特征工程_特征数据的评价标准
    启智平台新建一个调试任务后,如何配环境,并提交镜像
    区块链轻节点的问答
    【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )
    云原生技术在云计算中的应用探讨
    Windwos安装配置Jdk8时报计算机中丢失api-ms-win-crt-runtime-|1-1.0.dll
    Positive Technologies 在迪拜宣布与地区网络安全解决方案提供商开展合作
    软考高级系统架构设计师系列之:案例分析典型试题二
    33.Mybatis-Plus
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127681647