银行转账业务-使用事务

银行转账是是两个账户之间同时进行操作的,一方账户资金减少的同时另外一方的资金就要增加同样的金额。如果一方操作失败那么另外一方的操作就不会成功。也即是需要将这样的两个操作放在一个事务当中。只是这里使用到了层的概念。既然设计到转账那么肯定有一个账户类(DTO数据传输对象),还有一个类是专门用来访问该账户的(DAO数据访问对象)。而我们所需要进行的转账操作则是可以放在服务层进行处理(service)。

DTO(数据传输对象)

public class Account {
    private int id;
    private String account;
    private double cash;
    public Account() {
    }
    public Account(String account, double cash) {
        super();
        this.account = account;
        this.cash = cash;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public double getCash() {
        return cash;
    }
    public void setCash(double cash) {
        this.cash = cash;
    }

}
DAO(数据访问对象)


public class AccountDAO implements BaseDAO<Account> {

    private Connection conn;

    public AccountDAO(Connection conn) {
        this.conn = conn;
    }

    @Override
    public boolean insert(Account t) {
        return false;
    }

    @Override
    public boolean delete(Account t) {
        return false;
    }

    @Override
    public boolean update(Account t) {
        return DAOHelper.execUpdate(conn,
                "update tbaccount set cash = ? where account = ?", t.getCash(), t.getAccount());
    }

    @Override
    public Account findById(final Account t) {
        return DAOHelper.queryOne("select * from tbaccount where id = ?",
                new CallBack<Account>() {
                    @Override
                    public Account getData(ResultSet rs) {
                        try {
                            if (rs.next()) {
                                t.setAccount(rs.getString("account"));
                                t.setCash(rs.getDouble("cash"));
                            }
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                        return t;
                    }
                }, t.getId());
    }

    @Override
    public List<Account> findAll() {
        return null;
    }

}
service层

public class AccountService extends BaseConn {

    // 事务
    public void transfAccount(Account a, Account b, double money) {
        Connection conn = getConn();
        // 分别查询出A,B账号的个子金额
        AccountDAO dao = new AccountDAO(conn);
        a = dao.findById(a);
        b = dao.findById(b);
        if ((a.getAccount() != null) && (b.getAccount() != null)) {
            // 判断账号a余额是否足够
            if (a.getCash() >= money) {
                // 减少A账号的余额
                a.setCash(a.getCash() - money);
                // 增加B账号的余额
                b.setCash(b.getCash() + money);
                try {
                    // 关闭事务自动提交
                    conn.setAutoCommit(false);
                    // 开始转账(这里有问题)
                    boolean f1 = dao.update(a);
                    boolean f2 = dao.update(b);
                    if (f1 && f2) {
                        conn.commit();
                        System.out.println("转账成功!");
                    }
                } catch (SQLException e) {
                    try {
                        conn.rollback();
                        System.out.println("转账失败");
                    } catch (SQLException e1) {
                        e1.printStackTrace();
                    }
                    e.printStackTrace();
                }

            } else {
                System.out.println("余额不足!");
            }
        }else {
            System.out.println("账号A或者B不存在!");
        }
    }

    public static void main(String[] args) {
        Account a = new Account();
        Account b = new Account();
        a.setId(1);
        b.setId(3);
        new AccountService().transfAccount(a, b, 1000);
    }
}

当然这里使用了一些工具类,比如连接数据库的类。但是主要的操作是上面的三个类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值