3.1轉賬小案例
阿新 • • 發佈:2018-11-22
轉賬示意圖
在service層使用threadLocal示意圖
1.頁面顯示
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- 動態獲取應用名稱 --> <form action="${pageContext.request.contextPath }/transfer" method="post"> 轉出賬戶:<input type="text" name="out"><br> 轉入賬戶:<input type="text" name="in"><br> 轉賬金額:<input type="text" name="money"><br> <input type="submit" value="確認轉賬"> </form> </body> </html>
2.自定義的工具類
package com.xiaowei.utils; import java.sql.Connection; import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; public class MyDatasourceUtils { // 1.載入c3p0配置檔案 獲得快取池 public static ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 2.獲取connection連線物件 public static Connection getConnection() throws SQLException{ return dataSource.getConnection(); } // 3.建立threadLocal public static ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); // 4.獲取當前執行緒上繫結的conn public static Connection getCurrentConnection() throws SQLException{ // 從threadLocal尋找 當前執行緒是否有物件的connection Connection conn = tl.get(); if (conn==null) { conn = getConnection(); // 然後將conn繫結到當前的threadLocal(map)上 tl.set(conn); } return conn; } // 5.開啟事物 public static void startTransaction() throws SQLException{ Connection conn = getCurrentConnection(); conn.setAutoCommit(false); } // 6.回滾事物 public static void rollback() throws SQLException{ getCurrentConnection().rollback(); } // 7.提交事物 public static void commint() throws SQLException{ Connection conn = getCurrentConnection(); conn.commit(); // 將connection從threadLocal中移除 tl.remove(); conn.close(); } }
3.web層
package com.xiaowei.transfer.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.xiaowei.transfer.service.transferService; public class TransferServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.獲取轉出賬戶 轉入賬戶 金額 String out = request.getParameter("out"); String in = request.getParameter("in"); String moneyNum = request.getParameter("money"); // 2.呼叫service層的轉賬方法 將這些引數傳遞到service層 transferService tran = new transferService(); tran.transfer(out,in,moneyNum); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
4.service層
package com.xiaowei.transfer.service;
import java.sql.SQLException;
import com.xiaowei.transfer.dao.TransferDao;
import com.xiaowei.utils.MyDatasourceUtils;
public class transferService {
public void transfer(String out, String in, String moneyNum) {
TransferDao dao = new TransferDao();
// 執行轉出操作
try {
// 開啟事物
MyDatasourceUtils.startTransaction();
// 轉出操作
dao.out(out, moneyNum);
// 轉入操作
dao.in(in, moneyNum);
} catch (SQLException e) {
try {
// 回滾
MyDatasourceUtils.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
try {
// 提交
MyDatasourceUtils.commint();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
5.dao層
package com.xiaowei.transfer.dao;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import com.xiaowei.utils.MyDatasourceUtils;
public class TransferDao {
// 轉出操作
public void out(String out,String money) throws SQLException{
QueryRunner runner = new QueryRunner();
// 這裡需要獲取conn連線物件 先使用以前的
Connection conn = MyDatasourceUtils.getCurrentConnection();
String sql = "update count set money=money-? where name=?";
runner.update(conn, sql, money,out);
}
// 轉入操作
public void in(String in,String money) throws SQLException{
QueryRunner runner = new QueryRunner();
// 這裡需要獲取conn連線物件 先使用以前的
Connection conn = MyDatasourceUtils.getCurrentConnection();
String sql = "update count set money=money+? where name=?";
runner.update(conn, sql, money,in);
}
}