转账案例(传统JDBC方式)

什么是事务:
  • 事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么一起成功,要么一起失败.

方式一:

C3P0JDBCUtils
package bull05.Utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0JDBCUtils {
    private static final ComboPooledDataSource dataSource = new ComboPooledDataSource("bull");

    public static Connection getConnection() {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static DataSource getDataSource() {
        return dataSource;
    }

    public static void closeResource(ResultSet rs,PreparedStatement psmt,Connection conn) {
        if(rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            rs = null;
        }
        if(psmt != null) {
            try {
                psmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            psmt = null;
        }
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            conn = null;
        }
    }
}
Account:
package bull04.transfer;

public class Account {
    private String id;
    private String name;
    private Double money;

    public Account() {

    }

    public Account(String id, String name, Double money) {
        this.id = id;
        this.name = name;
        this.money = money;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getMoney() {
        return money;
    }
    public void setMoney(Double money) {
        this.money = money;
    }



}
AccountDao:
package bull04.transfer;
/*
 * 注意不要再Dao层关闭conn连接,要去业务层关闭。
 */
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.mysql.jdbc.ResultSet;

public class AccountDao {

    public void outMoney(Connection conn, String from, String to, Double money) {
        PreparedStatement psmt = null;
        ResultSet rs = null;
        try {
            String sql = "update  account set money = money - ? where name = ?";
            psmt = conn.prepareStatement(sql);
            psmt.setDouble(1, money);
            psmt.setString(2, from);
            psmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                psmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void inMoney(Connection conn, String from, String to, Double money) {
        PreparedStatement psmt = null;
        ResultSet rs = null;
        try {
            System.out.println(from+"---"+to+"---"+money);
            String sql = "update account set money = money + ? where name = ?";
            psmt = conn.prepareStatement(sql);
            psmt.setDouble(1, money);
            psmt.setString(2, to);
            psmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                psmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
AccountService:
package bull04.transfer;
/*
 * 业务层进行事务操作
 */
import java.sql.Connection;
import java.sql.SQLException;

import bull05.Utils.C3P0JDBCUtils;

public class AccountService {

    public void transfer(String from, String to, Double money) {
        AccountDao accountDao = new AccountDao();
        Connection conn = null;
        try {
            conn = C3P0JDBCUtils.getConnection();
            //开启事务
            conn.setAutoCommit(false);
            accountDao.outMoney(conn,from,to,money);

            //模拟异常
            //int i = 1/0;

            accountDao.inMoney(conn,from,to,money);
            //提交事务
            conn.commit();
        } catch (Exception e) {
            try {
                //有异常则回滚
                conn.rollback();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                //关闭conn连接
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
AccountServlet:
package bull04.transfer;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AccountServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        //接收数据
        String from = request.getParameter("from");
        String to = request.getParameter("to");
        Double money = Double.parseDouble(request.getParameter("money")) ;
        //调用业务层处理数据
        AccountService accountService = new AccountService();
        accountService.transfer(from,to,money);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request,response);
    }

}
transfer.jsp:
 <body>
    <h1>转账案例</h1>
    <form action="/Web13/AccountServlet" method="post">
        转账人:<input type="text" name="from"><br/>
        收款人:<input type="text" name="to"><br/>
        转账金额:<input type="text" name="money"><br/> 
        <input type="submit" value="确认">
    </form>
  </body>

方式二:改写C3P0工具类后案例的写法

C3P0JDBCUtils_1:
package bull05.Utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0JDBCUtils_1 {
private static final ComboPooledDataSource dataSource = new ComboPooledDataSource("bull");
private static final ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

    /**
     * 获得连接
     * @return
     */
    public static Connection getConnection() {
        Connection conn = null;
        try {
            //先从当前线程直接获取连接
            conn = tl.get();
            //如果当前线程连接为空,从连接池获取
            if(conn == null) {
                conn = dataSource.getConnection();
                //连接池获取后绑定到当前线程
                tl.set(conn);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 开启事务
     * @throws SQLException 
     */
    public static void beginTransaction() throws SQLException {
        Connection conn = null;
        //先从当前线程直接获取连接
        conn = tl.get();
        //如果当前线程连接为空,从连接池获取
        if(conn == null) {
            //连接池获取后绑定到当前线程
            conn = dataSource.getConnection();
            tl.set(conn);
        }
        conn.setAutoCommit(false);
    }

    /**
     * 提交事务
     * @return
     * @throws SQLException 
     */
    public static void commitTransaction() throws SQLException {
        Connection conn = null;
        conn.commit();
    }

    /**
     * 事务回滚
     * @return
     * @throws SQLException 
     */
    public static void rollbackTransaction() throws SQLException {
        Connection conn = null;
        conn.rollback();
    }

    /**
     * 获得数据源
     * @return
     */
    public static DataSource getDataSource() {
        return dataSource;
    }

    /**
     * 释放资源
     * @param rs
     * @param psmt
     * @param conn
     */
    public static void closeResource(ResultSet rs,PreparedStatement psmt,Connection conn) {
        if(rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            rs = null;
        }
        if(psmt != null) {
            try {
                psmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            psmt = null;
        }
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            conn = null;
        }
    }

}
AccountDao:
package bull05.transfer_1;
/*
 * 注意不要再Dao层关闭conn连接,要去业务层关闭。
 */
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import bull05.Utils.C3P0JDBCUtils;
import bull05.Utils.C3P0JDBCUtils_1;

import com.mysql.jdbc.ResultSet;

public class AccountDao {

    public void outMoney(String from, String to, Double money) {
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;
        try {
            conn = C3P0JDBCUtils_1.getConnection();
            String sql = "update  account set money = money - ? where name = ?";
            psmt = conn.prepareStatement(sql);
            psmt.setDouble(1, money);
            psmt.setString(2, from);
            psmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                psmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void inMoney(String from, String to, Double money) {
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;
        try {
            conn = C3P0JDBCUtils.getConnection();
            String sql = "update account set money = money + ? where name = ?";
            psmt = conn.prepareStatement(sql);
            psmt.setDouble(1, money);
            psmt.setString(2, to);
            psmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                psmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
AccountService
package bull05.transfer_1;
/*
 * 业务层进行事务操作
 */
import java.sql.Connection;
import java.sql.SQLException;

import bull05.Utils.C3P0JDBCUtils;
import bull05.Utils.C3P0JDBCUtils_1;

public class AccountService {

    public void transfer(String from, String to, Double money) {
        AccountDao accountDao = new AccountDao();
        try {
            //开启事务
            C3P0JDBCUtils_1.beginTransaction();
            accountDao.outMoney(from,to,money);

            //模拟异常
            //int i = 1/0;

            accountDao.inMoney(from,to,money);
            //提交事务
            C3P0JDBCUtils_1.commitTransaction();
        } catch (Exception e) {
            try {
                //有异常则回滚
                C3P0JDBCUtils_1.rollbackTransaction();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } 
    }

}
AccountServlet
transfer.jsp

猜你喜欢

转载自blog.csdn.net/sinat_40662281/article/details/80428699
今日推荐