JDBC事务处理、提交、回滚。

来源:互联网 发布:湖南网络交易平台 编辑:程序博客网 时间:2024/06/05 03:15
package com.softeem.bank.dao;import java.util.List;public interface BaseDAO<T> {public boolean insert(T t);public boolean delete(T t);public boolean update(T t);public List<T> findAll();public T findById(T t);}package com.softeem.bank.dao;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import com.softeem.bank.dto.Account;import com.softeem.utils.DAOHelper;import com.softeem.utils.DAOHelper.CallBack;public class AccountDAO implements BaseDAO<Account>{private Connection conn;public AccountDAO(Connection conn) {this.conn = conn;}@Overridepublic boolean insert(Account t) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean delete(Account t) {// TODO Auto-generated method stubreturn false;}//更新金额@Overridepublic boolean update(Account t) {return DAOHelper.execUpdate(conn, "update tbaccount set cash=? where account=?", t.getCash(),t.getAccount());}@Overridepublic Account findById(final Account t) {return DAOHelper.execQueryOne("select * from tbaccount where id=?", new CallBack<Account>() {@Overridepublic 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());} @Overridepublic List<Account> findAll() {// TODO Auto-generated method stubreturn null;}}package com.softeem.bank.dto;public class Account {private int id;private String account;private double cash;public Account() {// TODO Auto-generated constructor stub}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;}@Overridepublic String toString() {return "Account [id=" + id + ", account=" + account + ", cash=" + cash + "]";}}package com.softeem.bank.service;import java.sql.Connection;import java.sql.SQLException;import com.softeem.bank.dao.AccountDAO;import com.softeem.bank.dto.Account;import com.softeem.utils.BaseConn;/** * 业务逻辑层 * @author mrchai * */public class AccountService extends BaseConn{//事务public synchronized 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);//System.out.println(5/0);boolean f2 = dao.update(b);if(f1 && f2){conn.commit();System.out.println("转账成功!");}} catch (Exception 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);}}