spring-tx-java,spring事务纯注解方式之转账示例

基于maven项目的pom.xml配置

<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.2.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>5.2.1.RELEASE</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>5.2.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>5.2.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>5.2.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.45</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.21</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.9.4</version>
		</dependency>
	</dependencies>

bean
Account.java

package com.bean;

import java.io.Serializable;

public class Account implements Serializable {
	private static final long serialVersionUID = 1L;
	private Integer id;
	private int balance;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) {
		this.balance = balance;
	}

	@Override
	public String toString() {
		return "Account [id=" + id + ", balance=" + balance + "]";
	}
}

dao
AccountDao.java

package com.dao;

public interface AccountDao {
	/**
	 * 转出
	 * @param outId 转出账号
	 * @param money 转出金额
	 */
	public void transOut(Integer outId, int money);
	
	/**
	 * 转入
	 * @param inId 转入账号
	 * @param money 转入金额
	 */
	public void transIn(Integer inId, int money);
}

AccountDaoImpl.java

package com.dao.impl;

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

import com.dao.AccountDao;

@Repository
public class AccountDaoImpl implements AccountDao {
	@Autowired
	private JdbcTemplate template;

	@Override
	public void transOut(Integer outId, int money) {
		template.update("UPDATE tb_account SET balance=balance-? WHERE id=?", money, outId);
	}

	@Override
	public void transIn(Integer inId, int money) {
		template.update("UPDATE tb_account SET balance=balance+? WHERE id=?", money, inId);
	}
}

service
AccountService.java

package com.service;

public interface AccountService {
	/**
	 * 转账
	 * @param outId 转出账号
	 * @param inId  转入账号
	 * @param money 金额
	 */
	public void trans(Integer outId, Integer inId, int money);
}

AccountServiceImpl.java

package com.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.dao.AccountDao;
import com.service.AccountService;

@Service
@Transactional
public class AccountServiceImpl implements AccountService {
	@Autowired
	private AccountDao accountDao;

	/**
	 * 转账
	 * @param outId 转出账号
	 * @param inId  转入账号
	 * @param money 金额
	 */
	public void trans(Integer outId, Integer inId, int money) {
		accountDao.transOut(outId, money);
		//int a = 1/0;
		//System.out.println(a);
		accountDao.transIn(inId, money);
	}
}

配置类
AppConfig.java

package com;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@PropertySource("classpath:db.properties")
@ComponentScan("com.hpeu")
@Import({JdbcConfig.class})
@EnableTransactionManagement
public class AppConfig {

}

JdbcConfig.java

package com;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionManager;

import com.alibaba.druid.pool.DruidDataSource;

@Component
@Configuration
public class JdbcConfig {
	@Value("${jdbc.driverClassName}")
	private String driverClassName;
	@Value("${jdbc.url}")
	private String url;
	@Value("${jdbc.username}")
	private String username;
	@Value("${jdbc.password}")
	private String password;
	
	@Bean
	public DataSource dataSource() {
		DruidDataSource ds = new DruidDataSource();
		ds.setDriverClassName(driverClassName);
		ds.setUrl(url);
		ds.setUsername(username);
		ds.setPassword(password);
		return ds;
	}
	
	@Bean
	public JdbcTemplate jdbcTemplate(DataSource ds) {
		return new JdbcTemplate(ds);
	}
	
	@Bean
	public TransactionManager transactionManager(DataSource ds) {
		return new DataSourceTransactionManager(ds);
	}	
}

测试类
AccountServiceTest.java

package com.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import com.AppConfig;
import com.service.AccountService;

@RunWith(SpringRunner.class)
@ContextConfiguration(classes={AppConfig.class})
public class AccountServiceTest {
	@Autowired
	private AccountService service;
	
	@Test
	public void testTrans() {
		service.trans(1000, 1001, 1000);
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值