设为首页 加入收藏

TOP

使用JDBC连接MySQL数据库--典型案例分析(六)----实现账户转账操作(一)
2015-07-24 11:31:43 来源: 作者: 【 】 浏览:3
Tags:使用 JDBC 连接 MySQL 数据库 典型 案例分析 ---- 实现 账户 转账 操作

问题:使用JDBC连接数据库,实现帐号转账业务。从A账户转账为B账户500元

?

方案:

本案例中,要实现转账业务,需要执行两次更新操作,一是更新A账户的金额为在原有的金额基础上减去500元;

二是更新B账户的金额为在原有金额的基础上增加500元。这两次更新操作要么全部成功,要么全部失败(事务),来表示转账的成功或失败。如果A账户的金额更新为原来金额基础上减去500元,而B账户去没有在原有金额基础上增加500元,这样就造成了数据的不一致。我们可以使用事务来控制两次更新要么全部成功,要么全部失败。

本案例中,可以可以使用事务将两次更新操作封装成一个逻辑但愿,要么全部执行,要么完全不执行, 保证了数据的完整性。

下列方法实现JDBC事务的基本操作;

Connection.setAutoCommit(boolean)当参数为false时,关闭自动提交

Connection.commit()提交事务

Connection.rollback()回滚事务

使用JDBC控制事务的核心代码如下:

?

	try {
			con=ConnectionSource.getConnection();
			stmt=con.createStatement();
			//更新数据的SQL语句
	String sql1="update account set amount=amount-"+amount+"where id="+"'"+from+"'";
	String sql2="update account set amount=amount+"+amount+"where id="+"'"+to+"'";
			//关闭自动提交
		con.setAutoCommit(false);
		//执行SQL语句
		stmt.executeUpdate(sql1);
		stmt.executeUpdate(sql2);
		//提交
		con.commit();
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				System.out.println("回滚事务异常!");
				throw new RuntimeException(e);
			}
			System.out.println("数据库访问异常!");
			throw new RuntimeException(e);
		}finally{
			try {
				if(stmt!=null){
					stmt.close();
				}
				if(con!=null){
					con.close();
				}
			} catch (SQLException e) {
				System.out.println("释放资源时发生异常!");
			}
		}

?

步骤:

实现此方案需要按照如下步骤进行:

步骤一:创建Account表,并插入测试数据

在Mysql数据库中,创建表并插入测试数据,SQL语句如下所示:

?

CREATE TABLE account(
id CHAR(1),
amount NUMERIC(10,2)
);
INSERT INTO account VALUES('A',1000);
INSERT INTO account VALUES('B',2000);

?

步骤二:准备JDBC操作数据库的基本代码

首先,新建类Trans,在该类中新建transfer方法,方法的声明如下:

public void transfer(String from,String to, double amount){}

该方法表示从庄户from转账给账户to,转账金额为amount。

然后,准备数据库连接Connection对象,操作SQL语句的Statement对象并进行异常处理,代码如下所示:

?

package Account;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import dao.ConnectionSource;

public class Trans {
	public static void main(String[] args) {

	}
	public void transfer(String from,String to,double amount){
		Connection con=null;
		Statement stmt=null;
		try {
			con=ConnectionSource.getConnection();
			stmt=con.createStatement();
		} catch (SQLException e) {
			System.out.println("数据库访问异常!");
			throw new RuntimeException(e);
		}finally{
			try {
				if(stmt!=null){
					stmt.close();
				}
				if(con!=null){
					con.close();
				}
			} catch (SQLException e) {
				System.out.println("释放资源时发生异常!");
			}
		}
	}
}

?

步骤三:实现转账功能

使用Connection的setAutoCommit方法,commit方法以及rollback方法来控制事务,以确保转账功能正确实现,代码如下所示:

?

package Account;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import dao.ConnectionSource;

public class Trans {
	public static void main(String[] args) {

	}
	public void transfer(String from,String to,double amount){
		Connection con=null;
		Statement stmt=null;
		try {
			con=ConnectionSource.getConnection();
			stmt=con.createStatement();
			//更新数据的SQL语句
	String sql1="update account set amount=amount-"+amount+"where id="+"'"+from+"'";
	String sql2="update account set amount=amount+"+amount+"where id="+"'"
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇使用JDBC连接MySQL数据库--典型案.. 下一篇MySQL计算字段

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·nginx 监听一个端口 (2025-12-25 00:19:30)
·整个互联网就没有一 (2025-12-25 00:19:27)
·囧次元最新官网入口 (2025-12-25 00:19:24)
·如何利用Python做数 (2025-12-24 23:48:36)
·如何使用python进行 (2025-12-24 23:48:34)