zoukankan      html  css  js  c++  java
  • Spring实现MySQL事务操作

    一、创建数据库表

    表名:account

    字段:(`id`,`username`,`money`)

    二、dao、service层创建业务接口、类

    1 public interface UserDao {
    2     void addMoney();
    3     void reduceMoney();
    4 }
     1 @Repository
     2 public class UserDaoImpl implements UserDao {
     3 
     4     @Autowired
     5     private JdbcTemplate jdbcTemplate;
     6 
     7     @Override
     8     public void addMoney() {
     9         String sql = "update account set money = money + ? where username = ?";
    10         jdbcTemplate.update(sql,101,"zhangsan");
    11     }
    12 
    13     @Override
    14     public void reduceMoney() {
    15         String sql = "update account set money = money - ? where username = ?";
    16         jdbcTemplate.update(sql,102,"lisi");
    17     }
    18 }

     三、注解形式实现事务管理

     1 @Service
     2 @Transactional
     3 public class UserService {
     4 
     5     @Autowired
     6     UserDao userDao;
     7 
     8     public void accountMoney() {
     9         userDao.reduceMoney();
    10         // 模拟异常
    11         int i = 10 / 0;
    12         userDao.addMoney();
    13     }
    14 }

     bean.xml

     1 <?xml version="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:context="http://www.springframework.org/schema/context"
     5        xmlns:tx="http://www.springframework.org/schema/tx"
     6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     7     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
     8     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
     9 ">
    10     <!--  数据库连接池  -->
    11     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    12         <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    13         <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
    14         <property name="username" value="root"></property>
    15         <property name="password" value="root"></property>
    16     </bean>
    17     <!--  JdbcTemplate对象  -->
    18     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    19         <!--注入dataSource-->
    20         <property name="dataSource" ref="dataSource"></property>
    21     </bean>
    22     <!--  组件扫描  -->
    23     <context:component-scan base-package="com.example"></context:component-scan>
    24 
    25     <!--  创建事务管理器  -->
    26     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    27         <!--注入数据源-->
    28         <property name="dataSource" ref="dataSource"></property>
    29     </bean>
    30     <!--  开启事务注解  -->
    31     <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
    32 </beans>

     四、XML配置文件实现声明式事务管理

     1 <?xml version="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:context="http://www.springframework.org/schema/context"
     5        xmlns:tx="http://www.springframework.org/schema/tx"
     6        xmlns:aop="http://www.springframework.org/schema/aop"
     7        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     8     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
     9     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    10     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    11 ">
    12 
    13     <!--  数据库连接池  -->
    14     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    15         <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    16         <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
    17         <property name="username" value="root"></property>
    18         <property name="password" value="root"></property>
    19     </bean>
    20 
    21     <!--  JdbcTemplate对象  -->
    22     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    23         <!--注入dataSource-->
    24         <property name="dataSource" ref="dataSource"></property>
    25     </bean>
    26 
    27     <!--  组件扫描  -->
    28     <context:component-scan base-package="com.example"></context:component-scan>
    29 
    30     <!--  1. 创建事务管理器  -->
    31     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    32         <!--注入数据源-->
    33         <property name="dataSource" ref="dataSource"></property>
    34     </bean>
    35 
    36     <!--  2. 配置通知  -->
    37     <tx:advice id="txadvice">
    38         <!--     配置事务参数   -->
    39         <tx:attributes>
    40             <!--      指定哪种规则的方法上面添加事务      -->
    41             <tx:method name="accountMoney" propagation="REQUIRED"/>
    42             <!--<tx:method name="account*"/>-->
    43         </tx:attributes>
    44     </tx:advice>
    45 
    46     <!--  3. 配置切入点和切面  -->
    47     <aop:config>
    48         <!--    配置切入点    -->
    49         <aop:pointcut id="pt" expression="execution(* com.example.demo.service.UserService.*(..))"/>
    50         <!--    配置切面    -->
    51         <aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor>
    52     </aop:config>
    53     
    54 </beans>

    五、完全注解实现事务管理

    使用配置类代替xml文件

    dao、service 使用步骤二、三中的例子

     1 @Configuration // 配置类
     2 @ComponentScan(basePackages = "com.example") // 扫描包
     3 @EnableTransactionManagement //开启事务
     4 public class TxConfig {
     5 
     6     /**
     7      * 创建数据库连接池
     8      */
     9     @Bean
    10     public DruidDataSource getDruidDataSource() {
    11         DruidDataSource dataSource = new DruidDataSource();
    12         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    13         dataSource.setUrl("jdbc:mysql://localhost:3306/test");
    14         dataSource.setUsername("root");
    15         dataSource.setPassword("root");
    16         return dataSource;
    17     }
    18 
    19     /**
    20      *  创建JdbcTemplate对象
    21      */
    22     @Bean
    23     public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
    24         // 到IOC容器中根据类型找到dataSource
    25         JdbcTemplate jdbcTemplate = new JdbcTemplate();
    26         // 注入dataSource
    27         jdbcTemplate.setDataSource(dataSource);
    28         return jdbcTemplate;
    29     }
    30 
    31     /**
    32      * 创建事务管理器
    33      */
    34     @Bean
    35     public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
    36         DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
    37         transactionManager.setDataSource(dataSource);
    38         return transactionManager;
    39     }
    40 
    41 }

     六、测试

    使用xml配置文件实现事务管理时使用 new ClassPathXmlApplicationContext("bean.xml")加载配置文件;

    使用完全注解实现事务管理时使用 new AnnotationConfigApplicationContext(TxConfig.class)加载配置类。
    1     @Test
    2     public void accountTest2() {
    3         //完全注解时的测试(加载配置类);xml配置文件测试时使用 new ClassPathXmlApplicationContext("bean.xml")加载配置文件
    4         ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
    5         UserService userService = context.getBean("userService", UserService.class);
    6         userService.accountMoney();
    7     }    
  • 相关阅读:
    Grid如何固定列宽?
    ORACLE 去除重复记录
    Ajax学习之“一头雾水”
    对对碰方块交换及消去效果实现
    存储过程学习(二)
    asp.net 页面重用问题
    一个图表控件
    存储过程学习(一)
    ScriptManager.RegisterClientScriptBlock的疑问
    用indy做发贴机
  • 原文地址:https://www.cnblogs.com/moreforests/p/15212444.html
Copyright © 2011-2022 走看看