使用JDBC连接MySQL数据库--典型案例分析(六)----实现账户转账操作

转载请注明:http://blog.csdn.net/uniquewonderq

问题:使用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="+"'"+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("释放资源时发生异常!");
			}
		}
	}
}

步骤四:测试

在Trans类的main方法中,笤俑transfer方法,代码如下所示:

public static void main(String[] args) {
			Trans trans=new Trans();
			trans.transfer("A", "B", 500);
	}

运行Trans类,控制台无输出,表示成功,然后查看Mysql数据库中的account表,会发现A账户的金额减少了500元,B账户的金额增加了500元。

运行前:

运行后:

本节结束~

下次,继续,请持续关注哦~

时间: 2024-10-12 14:09:20

使用JDBC连接MySQL数据库--典型案例分析(六)----实现账户转账操作的相关文章

使用JDBC连接MySQL数据库--典型案例分析(八)----实现员工数据的分页查询

转载请注明:http://blog.csdn.net/uniquewonderq 问题: 使用JDBC连接Mysql数据库,实现对Emp表数据的分页查询功能. 方案: 对于较大的数据量,通常采用分页查询的方式.不同的数据库产品有不同的数据库级的分页查询策略.例如:Oracle通常使用rownum的方式:而Mysql使用limit的方式. Oracle采用rownum和子查询实现分页查询,SQL语句如下, select * from (select rownum rn,empno,ename,jo

使用JDBC连接MySQL数据库--典型案例分析(九)----财务帐号的DAO设计及其实现

转载请注明:http://blog.csdn.net/uniquewonderq 问题: 1.新增财务帐号: 2.修改某个财务帐号的信息. 3.修改某个财务帐号的状态. 4.查询所有的财务帐号. 5.根据某个财务帐号ID查询该财务帐号的全部信息. 方案: 在企业开发时,通常采用分层模式,常用的层次划分为表现层+控制层+业务层+持久层+数据源.持久层的功能是通过某些技术货框架将数据库的内容映射成对象,通过操作这些对象实现对数据库的操作.其主要目的是minutes业务对象和数据源那关系表之间的差异,

使用JDBC连接MySQL数据库--典型案例分析(三)----使用Apach DBCP连接池d

问题: 本案例要求使用Apach DBCP 连接数据池重构类DBUtility 为ConnectionSource类,并重构案例"实现DBUtility",提供连接的获取,关闭功能的"中的EmpDAO类,在该类中使用ConnectionSource来获取连接. 方案: 直接使用JDBC访问数据库时,需要避免一下隐患: 1.每一次数据操作请求都是需要建立数据库连接,打开连接,存取数据和关闭数据等步骤.而建立和打开数据库是一件既耗资源有费时间的过程,如果频繁发生这样的数据库操作,

(详细)JAVA使用JDBC连接MySQL数据库(1)- 软件

欢迎任何形式的转载,但请务必注明出处. 1.jdk 点击查看安装和环境配置教程 2.Eclipse 点击进入官网下载 注意下载完成打开.exe后,出现下图界面,有很多版本供选择 本人目前在学JSP所以安装的是Java EE版本,初学者可以选择第一个Java Developers版本 3.Mysql 点击进入官网下载 点击进入推荐安装教程+环境配置 下载页面注意事项 (虽然选项只有32位的,但下载完成后32位和64位都会安装) (上面的是在线安装,下面的是离线安装,建议选择离线安装) 系列文章 (

java jdbc 连接mysql数据库 实现增删改查

好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一訪问,它由一组用Java语言编写的类和接口组成.JDBC为数据库开发者提供了一个标准的API,据此能够构建更高级的工具和接口,使数据库开发者能够用纯 Java API 编写数据库应用程序,而且可跨平台执行,而且不受数据库供应商的限制.

JAVA使用JDBC连接MySQL数据库 二(2)

本文是对 <JAVA使用JDBC连接MySQL数据库 二>的改进. 上节使用的是PreparedStatement来执行数据库语句,但是preparedStatement需要传递一个sql语句参数,才能创建.然而,DBHelper类只是起到打开和关闭数据库的作用,所以sql语句是要放到应用层部分的,而不是放到DBHelper类中. 而statment不需要传递一个sql语句参数,就能创建. 修改部分如下: public class DBHelper { String driver = &quo

jdbc 连接mysql数据库

jdbc驱动到官网下载,放在jdk的相关目录下面,或者jar文件加入到工程下面 package test_mysql; import java.sql.*; import java.util.Set; public class testjdbc { public static Connection getConnection() throws ClassNotFoundException, SQLException{ String URL="jdbc:mysql://localhost:3306

Crystal Reports 2008(水晶报表) JDBC连接mysql数据库

在本blog中,主要介绍的是Crystal Reports 2008使用JDBC连接mysql数据库. 在连接之间,首先要确认你电脑上面都安装了mysql数据库. 其次,就是jdbc连接数据时候所使用的相关jar包. 接下来,就可以进行数据库的一些连接操作了. 对JDBC不是很了解的,可以到 完整java开发中JDBC连接数据库代码和步骤 了解相关的操作 1.打开Crystal Reports的数据专家 2.点击JDBC(JNDI)出现: 3.输入url和数据库类名,点击下一步: 4.输入pas