Spring学习-30:Spring中的事务管理之环境搭建
来源:互联网 发布:金鼎网络微营销软件 编辑:程序博客网 时间:2024/06/05 01:14
Spring的事务管理分成两类:
1、 编程式事务管理:手动编写代码完成事务管理。在实际应用中很少使用,通过TransactionTemplate手动管理事务。
2、声明式事务管理:不需要手动编写代码,配置。使用XML配置声明式事务,开发中推荐使用(代码侵入性最小),Spring的声明式事务是通过AOP实现的。
事务的讲解我们以转账案例为基本场景,下面介绍转账案例的环境准备:
(1)创建数据库表account:
CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `money` double DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;INSERT INTO `account` VALUES ('1', 'aaa', '1000');INSERT INTO `account` VALUES ('2', 'bbb', '1000');INSERT INTO `account` VALUES ('3', 'ccc', '1000');
(2)创建一个web项目,导入相应的jar包(基本开发包6个、mysql驱动、C3P连接池)
(3)建立配置文件applicationContext.xml、jdbc.properties、log4j.properties
(4)新建两个接口
package com.js.demo1;public interface AccountDao {/** * 转出的方法 * @param from:转出得人 * @param money:转账金额 */public void out(String from,Double money);/** * 转入的方法 * @param to:转入的人 * @param money:转账金额 */public void in(String to,double money);}
package com.js.demo1;/** * 账户的业务层的接口 * @author JiangShuai * */public interface AccountService {/** * 转账的方法 * @param from:从哪转出 * @param to:转入目标 * @param money:转账金额 */public void transfer(String from,String to,double money);}
(5)编写两个实现类
package com.js.demo1;import org.springframework.jdbc.core.support.JdbcDaoSupport;public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {/** * 转出的方法 * @param from:转出得人 * @param money:转账金额 */public void out(String from, Double money) {String sql = "update account set money = money - ? where name = ?";this.getJdbcTemplate().update(sql,money,from);}/** * 转入的方法 * @param to:转入的人 * @param money:转账金额 */public void in(String to, double money) {String sql = "update account set money = money + ? where name = ?";this.getJdbcTemplate().update(sql,money,to);}}
package com.js.demo1;public class AccountServiceImpl implements AccountService{private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}/** * 转账的方法 * @param from:从哪转出 * @param to:转入目标 * @param money:转账金额 */public void transfer(String from, String to, double money) {accountDao.out(from, money);accountDao.in(to, money);}}
(6)在配置文件中配置bean
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置属性文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 配置C3P0连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"></property><property name="jdbcUrl" value="${jdbc.url}"></property><property name="user" value="${jdbc.user}"></property><property name="password" value="${jdbc.password}"></property></bean><!-- 定义JDBC的模板类 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 业务层类 --><bean id="accountService" class="com.js.demo1.AccountServiceImpl"><property name="accountDao" ref="accountDao"></property></bean><!-- 持久层类 --><bean id="accountDao" class="com.js.demo1.AccountDaoImpl"><!-- 注入连接池对象,通过连接池对象去创建JDBC模板 --><property name="dataSource" ref="dataSource"></property></bean></beans>
至此,事务讲解部分的项目场景搭建就完成了。
下面,我们简单的测试一下这个场景的功能:
package com.js.demo1;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class Test1 {@Autowired@Qualifier("accountService")private AccountService accountService;@Testpublic void demo(){//完成转账accountService.transfer("aaa", "bbb", 100d);}}
查看数据库:
金额改变正确,说明功能正常。
这时候,系统内不存在事务,如果在转账过程中有异常发生,会出现什么情况呢?
修改AccountServiceImpl类:
package com.js.demo1;public class AccountServiceImpl implements AccountService{private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}/** * 转账的方法 * @param from:从哪转出 * @param to:转入目标 * @param money:转账金额 */public void transfer(String from, String to, double money) {accountDao.out(from, money);int i = 1/0; //制造异常accountDao.in(to, money);}}
重新运行测试:
发现“aaa”的钱扣了,但是“bbb”的钱没增加。
显然,这时候就需要有事务的管理了。
具体的事务管理的两种方式,我将在下一节跟大家探讨。欢迎关注。
0 0
- Spring学习-30:Spring中的事务管理之环境搭建
- 【Spring学习】之 事务管理
- Spring学习-28:Spring中的事务管理之事务的回顾
- spring学习总结(十二):spring 中的事务管理
- 事务管理之Spring事务管理
- Spring 学习笔记之事务管理
- Spring学习之事务管理基础
- [Spring]Spring中的事务管理
- 学习笔记之——spring中的事务管理
- Java之Spring源码学习 - 环境搭建
- JAVA-Spring学习之环境搭建
- Spring Boot 学习之环境搭建
- Spring学习环境搭建
- Spring之搭建环境
- Spring学习-29:Spring中的事务管理之事务开发常用API的详解
- Spring学习-31:Spring中的事务管理之手动编码的方式
- Spring学习-32:Spring中的事务管理之声明式事务(原始方式,基于TransactionProxyBean)
- Spring学习-33:Spring中的事务管理之声明式事务(基于切面自动代理)
- 第七届蓝桥杯—冰雹数
- 利用JS封装iframe骗过搜索引擎
- Python中的排列和组合
- Android可左右滑动的ListView开源框架SwipeMenuListView
- muduo库中对线程池的实现(1)
- Spring学习-30:Spring中的事务管理之环境搭建
- mysql表的清空、删除和修改操作详解
- Wifi-direct 相关记录
- linux之进程详解与操作编程
- 2017年最新cvv2知识普及
- STM32中的几个时钟SysTick、FCLK、SYSCLK、HCLK(For STM32F10x)
- params、out和ref
- python xrange和range的使用区别
- 1009