spring实现事务管理案例
总结:事务管理一定实在service业务层实现
实现步骤:
1.一个业务方法公共用一个连接对象
2.业务层公用的连接一起提交或回滚
pom文件依赖
<dependencies>
<!--spring容器-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.29</version>
</dependency>
<!--spring测试test-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.29</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!--dbutil-->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.4</version>
</dependency>
<!--数据源-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
实体类
package com.ape.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 吉*
* @version 1.0
* @since 2023/10/25
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
private int aid;
private String aname;
private int amoney;
public Account(String aname, int amoney) {
this.aname = aname;
this.amoney = amoney;
}
}
dao层
package com.ape.mapper;
import com.ape.pojo.Account;
import com.ape.util.ConnectionUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
/**
* @author 吉*
* @version 1.0
* @since 2023/10/25
**/
public class DaoMapper implements IDaoMapper {
QueryRunner queryRunner;
public void setQueryRunner(QueryRunner queryRunner) {
this.queryRunner = queryRunner;
}
ConnectionUtil connection;
public void setConnection(ConnectionUtil connection) {
this.connection = connection;
}
@Override
public void add(Account account) {
try {
queryRunner.update(connection.createCon(),"insert into account(aname,amoney) values (?,?)",account.getAname(),account.getAmoney());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
@Override
public void update(Account account) {
try {
queryRunner.update(connection.createCon(),"update account set aname=?,amoney=? where aid =?",account.getAname(),account.getAmoney(),account.getAid());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
@Override
public void delete(int aid) {
try {
queryRunner.update(connection.createCon(),"delete from account where aid=?",aid);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
@Override
public Account findByName(String name) {
try {
//new beanHandlers对象做映射关系
Account account = queryRunner.query(connection.createCon(),"select * from account where aname= ?", new BeanHandler<Account>(Account.class),name);
return account;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public List<Account> findAll() {
try {
List<Account> list = queryRunner.query(connection.createCon(),"select * from account", new BeanListHandler<Account>(Account.class));
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
service层
package com.ape.service;
import com.ape.mapper.IDaoMapper;
import com.ape.pojo.Account;
import com.ape.util.ConnectionUtil;
import com.ape.util.TransactionUtil;
import com.mchange.v1.db.sql.ConnectionUtils;
import javax.sql.DataSource;
import java.sql.Connection;
import java.util.List;
/**
* @author 吉*
* @version 1.0
* @since 2023/10/25
**/
public class ServiceImp implements IService {
IDaoMapper dao;
public void setDao(IDaoMapper dao) {
this.dao = dao;
}
TransactionUtil transactionUtil;
public void setTransactionUtil(TransactionUtil transactionUtil) {
this.transactionUtil = transactionUtil;
}
@Override
public void transfer(String transferName, String targetName, int money) {
try {
transactionUtil.upTransaction();
Account transfer = dao.findByName(transferName);
Account target = dao.findByName(targetName);
transfer.setAmoney(transfer.getAmoney()-1000);
target.setAmoney(target.getAmoney()+1000);
dao.update(transfer);
// int s = 10/0; //事务测试
dao.update(target);
transactionUtil.commitTransaction();
} catch (Exception e) {
e.printStackTrace();
transactionUtil.rollbackTransaction();
} finally {
transactionUtil.closeTransaction();
}
}
@Override
public void add(Account account) {
dao.add(account);
}
@Override
public void update(Account account) {
dao.update(account);
}
@Override
public void delete(int aid) {
dao.delete(aid);
}
@Override
public Account findByName(String name) {
return dao.findByName(name);
}
@Override
public List<Account> findAll() {
return dao.findAll();
}
}
controller层
package com.ape.controller;
import com.ape.pojo.Account;
import com.ape.service.IService;
import java.util.List;
/**
* @author 吉*
* @version 1.0
* @since 2023/10/25
**/
public class ControllerImp implements IController {
IService service;
public void setService(IService service) {
this.service = service;
}
@Override
public void transfer(String transferName, String targetName, int money) {
service.transfer(transferName,targetName,money);
}
@Override
public void add(Account account) {
service.add(account);
}
@Override
public void update(Account account) {
service.update(account);
}
@Override
public void delete(int aid) {
service.delete(aid);
}
@Override
public Account findByName(String name) {
return service.findByName(name);
}
@Override
public List<Account> findAll() {
return service.findAll();
}
}
配置文件
<!--数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/myschool?serverTimezone=GMT"></property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!--connection连接-->
<bean id="connectionUtil" class="com.ape.util.ConnectionUtil">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--事务-->
<bean id="transactionUtil" class="com.ape.util.TransactionUtil">
<property name="connection" ref="connectionUtil"></property>
</bean>
<!--queryRunner-->
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean>
<!--dao-->
<bean id="daoMapper" class="com.ape.mapper.DaoMapper">
<property name="queryRunner" ref="queryRunner"></property>
<property name="connection" ref="connectionUtil"></property>
</bean>
<!--service-->
<bean id="serviceImp" class="com.ape.service.ServiceImp">
<property name="dao" ref="daoMapper"></property>
<property name="transactionUtil" ref="transactionUtil"></property>
</bean>
<!--controller-->
<bean id="controllerImp" class="com.ape.controller.ControllerImp">
<property name="service" ref="serviceImp"></property>
</bean>
test类
package com.ape.test;
import com.ape.controller.ControllerImp;
import com.ape.pojo.Account;
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.SpringJUnit4ClassRunner;
import java.util.List;
/**
* @author 吉*
* @version 1.0
* @since 2023/10/25
**/
@RunWith(SpringJUnit4ClassRunner.class)//junit运行环境
@ContextConfiguration(locations = "classpath:applicationContext.xml")//加载spring主配置文件
public class Test01 {
@Autowired
private ControllerImp controllerImp;
@Test
public void show3(){
controllerImp.transfer("jx","djx",1000);
}
}