1. 程式人生 > >3.1轉賬小案例

3.1轉賬小案例

轉賬示意圖

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