jdbc使用prepareStatement实现简单的转账功能

本文提供了一个使用Java进行数据库转账操作的示例代码。该示例展示了如何通过预编译语句更新数据库中的金钱字段,并利用事务确保操作的原子性。文章还包含了错误处理和资源释放的代码。

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


public class BaseDao {
Connection con ;
PreparedStatement pt ;
public void transfer(int eid1,int eid2, double amount){
int result1 = 0;
int result2 = 0;
String sql1 = "update employee set money = money - ? where eid = ?";
String sql2 = "update employee set money = money + ? where eid = ?";
try {
con = MyConnection.getCon();
con.setAutoCommit(false);
pt = con.prepareStatement(sql1);
pt.setDouble(1, amount);
pt.setInt(2, eid1);
result1 = pt.executeUpdate();
if(result1 != 1){
con.rollback();
System.err.println("没有"+eid1+"这个id");
return;
}
System.out.println(result1);
pt = con.prepareStatement(sql2);
pt.setDouble(1, amount);
pt.setInt(2, eid2);

System.out.println(result2);
result2 = pt.executeUpdate();
if(result2 != 1){
con.rollback();
System.err.println("没有"+eid2+"这个id");
return;
}
con.commit();
} catch (Exception e) {
try {
                con.rollback();
            } catch (SQLException e1) {
                System.out.println("回滚事务异常!");
                throw new RuntimeException(e);
            }
            System.out.println("数据库访问异常!");
            throw new RuntimeException(e);
}finally{
try {
                if(pt!=null){
                    pt.close();
                }
                if(con!=null){
                    con.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
}
}

}



### 创建简单ATM存取款机系统 #### 使用Java Swing和JDBC构建GUI界面与数据库交互 为了实现一个简易版的自动柜员机(ATM)模拟器,该应用允许用户进行存款、提款操作并查询账户余额。此过程涉及两个主要部分:图形用户接口(GUI)的设计以及通过JDBC连接到后台数据库来存储客户数据。 ##### 设计图形用户界面 (GUI) 利用`javax.swing.*;`包中的类创建直观易用的操作面板。下面是一个基础窗口布局的例子: ```java import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ATMMachine extends JFrame { private JTextField accountField, amountField; private JLabel balanceLabel; public ATMMachine() { setTitle("Simple ATM System"); setSize(300, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); // 添加组件... add(panel); setVisible(true); } } ``` 此处定义了一个名为`ATMMachine`的新窗体,在构造函数里设置了标题栏文字大小,并指定了关闭按钮的行为模式为退出应用程序[^1]。 ##### 数据库表结构设计 对于本案例而言,仅需一张表格即可满足需求——用于保存用户的账号信息及其对应的可用资金数额。SQL语句如下所示: ```sql CREATE TABLE IF NOT EXISTS accounts ( id INT AUTO_INCREMENT PRIMARY KEY, number VARCHAR(50), balance DECIMAL(10 , 2 ) ); ``` 上述命令将在MySQL或其他兼容SQL标准的关系型数据库管理系统中建立一个名为`accounts`的数据集,它包含了三个字段:自增主键`id`、唯一标识符`number`(即银行账户号码),以及表示当前余额数值类型的`balance`列[^4]。 ##### 实现基本业务逻辑 当用户输入有效的银行卡号后点击相应按键时触发事件处理器方法;内部调用了预编译好的PreparedStatement对象执行具体的金融交易动作并向界面上反馈最新状态消息给顾客查看。 ```java // 假设已存在DatabaseHelper帮助类负责处理所有关于DB的任务 private void handleDepositOrWithdraw(String actionType){ String acctNo = accountField.getText().trim(); double amt = Double.parseDouble(amountField.getText()); try{ PreparedStatement pstmt = null; ResultSet rs = null; Connection conn = DatabaseHelper.getConnection(); switch(actionType.toLowerCase()){ case "deposit": // 更新指定记录项下的金额增加量 pstmt = conn.prepareStatement( "UPDATE accounts SET balance=balance+? WHERE number=?" ); break; case "withdraw": // 检查是否有足够的余额可供支取后再做更新 pstmt = conn.prepareStatement( "SELECT * FROM accounts WHERE number=? AND balance>=?" ); rs = pstmt.executeQuery(); if(!rs.next()) throw new Exception("Insufficient funds"); pstmt.close(); pstmt = conn.prepareStatement( "UPDATE accounts SET balance=balance-? WHERE number=?" ); break; } pstmt.setDouble(1, amt); pstmt.setString(2, acctNo); int affectedRows = pstmt.executeUpdate(); if(affectedRows > 0){ JOptionPane.showMessageDialog(this,"Transaction successful!"); refreshBalance(acctNo); // 刷新显示区域内的余额数 }else{ JOptionPane.showMessageDialog(this,"Invalid Account Number."); } }catch(Exception e){ e.printStackTrace(); JOptionPane.showMessageDialog(this,e.getMessage()); }finally{/*释放资源*/} } private void refreshBalance(String acctNo){ /* 查询最新的余额值 */ try(Connection conn = DatabaseHelper.getConnection()){ PreparedStatement pstmt = conn.prepareStatement( "SELECT balance FROM accounts WHERE number=? LIMIT 1" ); pstmt.setString(1, acctNo); ResultSet rs = pstmt.executeQuery(); while(rs.next()){ balanceLabel.setText("$"+String.format("%.2f",rs.getDouble("balance"))); } } catch(SQLException ex){ex.printStackTrace();} } ``` 这段代码片段展示了如何根据不同的事务类型(`actionType`)去调整账户余额,并且提供了错误提示机制确保用户体验友好性。每当完成一次成功的转账之后都会立即刷新页面上的余额标签内容以便让用户及时了解变动情况[^2].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值