基于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);
}
}