什么是事务:
- 事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么一起成功,要么一起失败.
方式一:
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) {
e.printStackTrace();
}
rs = null;
}
if(psmt != null) {
try {
psmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
psmt = null;
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
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;
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);
accountDao.inMoney(conn,from,to,money);
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
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) {
e.printStackTrace();
}
rs = null;
}
if(psmt != null) {
try {
psmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
psmt = null;
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
AccountDao:
package bull05.transfer_1;
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);
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