spring实现事务管理案例

本文详细介绍了如何在Spring框架中,特别是在Service层实现事务管理,包括使用C3P0数据源、事务工具TransactionUtil以及事务操作的封装。通过实际代码展示了转账功能的事务控制过程。
摘要由CSDN通过智能技术生成

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值