java 转账_Java总结(随笔)——代码总结JDBC以及事务,以银行转账,查账等为例...

本文通过一个银行转账的实例,详细讲解了Java使用JDBC操作数据库及事务管理的过程。包括数据库表设计、数据库连接工具类、转账、查询、存款、取款、开户等功能的实现。用户可以通过命令行进行交互操作,体验完整的银行系统模拟流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本片文章是对上一篇文章中的事务的例子的功能扩写,用以加深理解,以及代码的熟练度:

(1)数据库表

ac8ac41ed7c425351cbc9fdf43c04eb7.png

数据:

bbec4ae2390eeee198b557bb16557072.png

(2)引入数据库连接jar包

(3)工具类:

package org.jdbc.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

//操作数据库的工具类

public class DBUtil {

// 私有化构造方法

private DBUtil() {

}

private static String url = null;

private static String user = null;

private static String password = null;

static {

try {

Class.forName("com.mysql.jdbc.Driver");

Properties pro = new Properties();

pro.load(new FileInputStream("src/jdbc.properties"));

url = pro.getProperty("url");

user = pro.getProperty("user");

password = pro.getProperty("password");

} catch (Exception e) {

e.printStackTrace();

}

}

// 读取外部属性文件获取连接对象,需手动输入url

public static Connection getConnection1(String url) {

Properties pro = new Properties();

Connection conn = null;

InputStream input = null;

try {

input = new FileInputStream("E:" + File.separator

+ "JDBC.properties");

pro.load(input);

conn = DriverManager.getConnection(url, pro);

} catch (Exception e) {

e.printStackTrace();

}

return conn;

}

// 读取工程下的配置文件,获取连接对象参数,不需手动输入url

public static Connection getConnection2() throws SQLException {

Connection conn = DriverManager.getConnection(url, user, password);

return conn;

}

// 释放全部资源

public static void closeAll(Connection conn, Statement stat, ResultSet rs)

throws SQLException {

if (conn != null) {

conn.close();

}

if (stat != null) {

stat.close();

}

if (rs != null) {

rs.close();

}

}

// 释放所用资源

public static void closePart(Connection conn, Statement stat)

throws SQLException {

if (conn != null) {

conn.close();

}

if (stat != null) {

stat.close();

}

}

}

(4)编写代码:

package org.jdbc.transcation;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.Scanner;

import org.jdbc.util.DBUtil;

public class AccountDemo {

// 主方法控制运行方向

public static void main(String[] args) {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

Scanner scan = new Scanner(System.in);

System.out.println("欢迎来到模拟银行界面");

while (true) {

System.out.print("请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):");

int chioce;

try {

chioce = scan.nextInt();

if (chioce == 1 | chioce == 2 | chioce == 3 | chioce==4 | chioce==5 |chioce == 8) {

switch (chioce) {

case 1: // 转账

System.out.print("请输入转出账户姓名:");

String fromName = br.readLine();

System.out.print("请输入转入账户姓名:");

String toName = br.readLine();

System.out.print("请输入转账金额:");

int money = scan.nextInt();

boolean flag = transFerMoney(fromName, toName, money);

if (flag) {

System.out.println("转账成功");

showBalance(toName);

showBalance(fromName);

} else {

System.out.println("请检查你输入的信息是否正确,请输入正确的信息,重新办理此业务,谢谢!");

}

break;

case 2: // 查询

System.out.print("请选择 (1:查询全部账户信息\t2:个人账户信息):");

int chioce1 = scan.nextInt();

if (chioce1 == 1 | chioce1 == 2) {

switch (chioce1) {

case 1: // 查询全部账户

selectAll();

break;

case 2: // 查询个人账户

System.out.print("请输入查询账户姓名:");

String balName = br.readLine();

selectPart(balName);

break;

}

} else {

System.out.println("你的选项错误,请重新输入");

}

break;

case 3: // 存款

System.out.print("请输入存款账户名:");

String savName = br.readLine();

System.out.print("请输入存款金额:");

int savMoney = scan.nextInt();

boolean isSave = saveMoney(savName, savMoney);

if (isSave) {

System.out.println("存款成功");

showBalance(savName);

} else {

System.out.println("你输入的账户信息有误,存款失败..");

}

break;

case 4: // 取款

System.out.print("请输入取款账户名:");

String draName = br.readLine();

System.out.print("请输入取款金额:");

int draMoney = scan.nextInt();

boolean isDraw = drawMoney(draName, draMoney);

if (isDraw) {

System.out.println("取款成功");

showBalance(draName);

} else {

System.out.println("你输入的账户信息有误,取款失败..");

}

break;

case 5: // 取款

System.out.print("请输入开户账户名:");

String opName = br.readLine();

System.out.print("请输入开户存款金额:");

int opBalance = scan.nextInt();

boolean isOpen = openAccount(opName, opBalance);

if (isOpen) {

System.out.println("恭喜你,开户成功");

System.out.println("当前账户信息:");

selectPart(opName);

} else {

System.out.println("Sorry,发生异常,你开户失败..");

}

break;

case 8: // 退出本系统

System.out.println("谢谢你的光临,再见!!");

System.exit(0);

}

} else {

System.out.println("你的选项错误,请重新输入");

}

} catch (IOException e) {

System.out.println("你有非法操作,产生异常现象:"+e.getMessage());

}

}

}

// 转钱方法

@SuppressWarnings("resource")

public static boolean transFerMoney(String fromName, String toName,

int money) {

boolean flag = false;

PreparedStatement ps = null;

Connection conn = null;

ResultSet rs=null;

try {

conn = DBUtil.getConnection2();

String sql="select * from account where name=?";

ps=conn.prepareStatement(sql);

ps.setString(1, fromName);

rs=ps.executeQuery();

boolean flag1=false;

flag1= rs.next();

ps.close();

ps=conn.prepareStatement(sql);

ps.setString(1, fromName);

rs=ps.executeQuery();

boolean flag2=false;

flag2= rs.next();

ps.close();

if((flag1 && flag2)!=false){

conn.setAutoCommit(false);// 取消自动提交

String sql1 = "update account set balance=balance-? where name=?";

String sql2 = "update account set balance=balance+? where name=?";

ps = conn.prepareStatement(sql1);

ps.setInt(1, money);

ps.setString(2, fromName);// 转出

ps.executeUpdate();

ps.close();

ps = conn.prepareStatement(sql2);

ps.setInt(1, money);

ps.setString(2, toName);// 转入

ps.executeUpdate();

conn.commit();// 提交事务

flag = true;

}else{

System.out.println("Sorry,你输入的账户有误,不能进行转账处理");

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

DBUtil.closeAll(conn, ps,rs);

} catch (SQLException e) {

e.printStackTrace();

}

}

return flag;

}

// 全部账户查询方法信息

public static void selectAll() {

PreparedStatement ps = null;

Connection conn = null;

ResultSet rs = null;

try {

conn = DBUtil.getConnection2();// 建立连接

String sql = "select * from account";

ps = conn.prepareStatement(sql);

rs = ps.executeQuery();

System.out.println("全部账户信息查询结果为:");

System.out.println("编号\t姓名\t账户余额");

while (rs.next()) {

int id = rs.getInt("id");

String name = rs.getString("name");

int balance = rs.getInt("balance");

System.out.println(id + "\t" + name + "\t" + balance);

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

DBUtil.closeAll(conn, ps, rs);

} catch (SQLException e) {

e.printStackTrace();

}

}

}

// 查询单人账户信息

@SuppressWarnings("resource")

public static void selectPart(String balName) {

PreparedStatement ps = null;

Connection conn = null;

ResultSet rs = null;

try {

conn = DBUtil.getConnection2();// 建立连接

String sql3 = "select * from account where name=?";

ps = conn.prepareStatement(sql3);

ps.setString(1, balName);

rs = ps.executeQuery();

boolean flag = rs.next();

if (flag == true) {

System.out.println(balName + "账户信息查询结果为:");

System.out.println("编号\t姓名\t账户余额");

rs = ps.executeQuery();

while (rs.next()) {

int id = rs.getInt("id");

String name = rs.getString("name");

int balance = rs.getInt("balance");

System.out.println(id + "\t" + name + "\t" + balance);

}

} else {

System.out.println("你输入的 账户信息不存在,请重新输入..");

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

DBUtil.closeAll(conn, ps, rs);

} catch (SQLException e) {

e.printStackTrace();

}

}

}

// 存钱方法

public static boolean saveMoney(String saveName, int savMoney) {

boolean flag = false;

Connection conn = null;

PreparedStatement ps = null;

String sql6 = "update account set balance=balance+? where name=?";

int count = 0;

try {

conn = DBUtil.getConnection2();

ps = conn.prepareStatement(sql6);

ps.setInt(1, savMoney);

ps.setString(2, saveName);

count = ps.executeUpdate();

if (count != 0) {

flag = true;

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

DBUtil.closePart(conn, ps);

} catch (SQLException e) {

e.printStackTrace();

}

}

return flag;

}

// 取钱方法

public static boolean drawMoney(String drawName, int draMoney) {

boolean flag = false;

Connection conn = null;

PreparedStatement ps = null;

String sql7 = "update account set balance=balance-? where name=?";

int count = 0;

try {

conn = DBUtil.getConnection2();

ps = conn.prepareStatement(sql7);

ps.setInt(1, draMoney);

ps.setString(2, drawName);

count = ps.executeUpdate();

if (count != 0) {

flag = true;

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

DBUtil.closePart(conn, ps);

} catch (SQLException e) {

e.printStackTrace();

}

}

return flag;

}

// 建立新的账户

public static boolean openAccount(String opName, int opBalance) {

boolean flag = false;

Connection conn = null;

PreparedStatement ps = null;

String sql9 = "insert into account(name,balance) values(?,?)";

int count = 0;

try {

conn = DBUtil.getConnection2();

ps = conn.prepareStatement(sql9);

ps.setString(1, opName);

ps.setInt(2, opBalance);

count = ps.executeUpdate();

if (count != 0) {

flag = true;

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

DBUtil.closePart(conn, ps);

} catch (SQLException e) {

e.printStackTrace();

}

}

return flag;

}

//显示余额方法

@SuppressWarnings("resource")

public static void showBalance(String showName) {

PreparedStatement ps = null;

Connection conn = null;

ResultSet rs = null;

try {

conn = DBUtil.getConnection2();// 建立连接

String sql10 = "select balance from account where name=?";

ps = conn.prepareStatement(sql10);

ps.setString(1, showName);

rs = ps.executeQuery();

rs = ps.executeQuery();

while (rs.next()) {

int shBalance = rs.getInt("balance");

System.out.println(showName + "账户当前 余额为:"+shBalance);

}

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

DBUtil.closeAll(conn, ps, rs);

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

运行结果:

欢迎来到模拟银行界面

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):2

请选择 (1:查询全部账户信息 2:个人账户信息):1

全部账户信息查询结果为:

编号 姓名 账户余额

1 项羽 35013020

2 刘邦 20002980

3 李世民 47618000

4 赵匡胤 23990000

5 朱元璋 12356000

6 嬴政 32200000

7 曹操 200000000

8 孙权 14500000

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):1

请输入转出账户姓名:李世民

请输入转入账户姓名:曹操

请输入转账金额:3000

转账成功

曹操账户当前 余额为:200003000

李世民账户当前 余额为:47615000

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):1

请输入转出账户姓名:呵呵

请输入转入账户姓名:哈哈

请输入转账金额:20000

Sorry,你输入的账户有误,不能进行转账处理

请检查你输入的信息是否正确,请输入正确的信息,重新办理此业务,谢谢!

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):2

请选择 (1:查询全部账户信息 2:个人账户信息):2

请输入查询账户姓名:刘邦

刘邦账户信息查询结果为:

编号 姓名 账户余额

2 刘邦 20002980

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):2

请选择 (1:查询全部账户信息 2:个人账户信息):3

你的选项错误,请重新输入

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):2

请选择 (1:查询全部账户信息 2:个人账户信息):2

请输入查询账户姓名:哈哈

你输入的 账户信息不存在,请重新输入..

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):3

请输入存款账户名:朱元璋

请输入存款金额:300000

存款成功

朱元璋账户当前 余额为:12656000

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):3

请输入存款账户名:呵呵

请输入存款金额:3300

你输入的账户信息有误,存款失败..

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):4

请输入取款账户名:曹操

请输入取款金额:250

取款成功

曹操账户当前 余额为:200002750

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):

4

请输入取款账户名:哈哈

请输入取款金额:200

你输入的账户信息有误,取款失败..

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):5

请输入开户账户名:李渊

请输入开户存款金额:300000000

恭喜你,开户成功

当前账户信息:

李渊账户信息查询结果为:

编号 姓名 账户余额

9 李渊 300000000

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):2

请选择 (1:查询全部账户信息 2:个人账户信息):1

全部账户信息查询结果为:

编号 姓名 账户余额

1 项羽 35013020

2 刘邦 20002980

3 李世民 47615000

4 赵匡胤 23990000

5 朱元璋 12656000

6 嬴政 32200000

7 曹操 200002750

8 孙权 14500000

9 李渊 300000000

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):6

你的选项错误,请重新输入

请输入你的选择(1 转账 2 查询 3存款 4取款 5开户 8退出):8

谢谢你的光临,再见!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值