通过Java控制台开发一个银行管理系统,使用MySQL作为后台数据,实现银行管理员工功能和顾客功能。具体要求如下顾客功能:登录、存款、取款、转账、修改密码、退出代码
时间: 2023-12-08 11:06:21 浏览: 49
好的,这是一个比较复杂的问题,需要一定的时间和代码量。我会尽力回答你的问题,但是由于篇幅限制,可能无法写出完整的代码,只能提供思路和代码片段,希望对你有所帮助。
首先,我们需要设计数据库表结构,包括顾客表和管理员表,以及和它们相关联的其他表,比如存款、取款、转账、密码修改等。这里只给出一个简单的顾客表结构:
```sql
CREATE TABLE customer (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(50) NOT NULL,
balance DECIMAL(10, 2) DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
然后,我们需要编写Java代码连接数据库,进行数据的增删改查。这里使用JDBC实现。首先,我们需要引入MySQL驱动:
```java
import java.sql.*;
public class BankSystem {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.err.println("无法加载驱动程序");
e.printStackTrace();
}
// 连接数据库
String url = "jdbc:mysql://localhost:3306/bank_system";
String user = "root";
String password = "123456";
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
// 执行SQL语句
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM customer");
while (rs.next()) {
System.out.println(rs.getInt("id") + "\t" +
rs.getString("username") + "\t" +
rs.getString("password") + "\t" +
rs.getBigDecimal("balance") + "\t" +
rs.getTimestamp("created_at"));
}
rs.close();
stmt.close();
} catch (SQLException e) {
System.err.println("无法连接数据库");
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
```
上述代码中,我们首先加载了MySQL驱动,然后连接了数据库,并执行了一个简单的SELECT语句,将结果输出到控制台上。
接下来,我们需要实现顾客功能。首先是登录功能,这里我们可以使用PreparedStatement预编译SQL语句,防止SQL注入攻击:
```java
public static boolean login(String username, String password) {
String sql = "SELECT * FROM customer WHERE username = ? AND password = ?";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
```
上述代码中,我们首先获取数据库连接,然后使用PreparedStatement预编译SQL语句,并将参数绑定到占位符上,最后执行查询并返回结果。
接下来是存款功能,这里我们可以使用事务(Transaction)保证数据的一致性:
```java
public static boolean deposit(String username, BigDecimal amount) {
String sql1 = "UPDATE customer SET balance = balance + ? WHERE username = ?";
String sql2 = "INSERT INTO deposit (username, amount) VALUES (?, ?)";
try (Connection conn = getConnection();
PreparedStatement stmt1 = conn.prepareStatement(sql1);
PreparedStatement stmt2 = conn.prepareStatement(sql2)) {
conn.setAutoCommit(false);
stmt1.setBigDecimal(1, amount);
stmt1.setString(2, username);
int rows1 = stmt1.executeUpdate();
if (rows1 != 1) {
conn.rollback();
return false;
}
stmt2.setString(1, username);
stmt2.setBigDecimal(2, amount);
int rows2 = stmt2.executeUpdate();
if (rows2 != 1) {
conn.rollback();
return false;
}
conn.commit();
return true;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
```
上述代码中,我们首先获取数据库连接,并使用setAutoCommit(false)关闭自动提交事务。然后,我们使用两个PreparedStatement分别执行存款操作和记录存款记录操作。如果两个操作都执行成功,则提交事务,否则回滚事务。
接下来是取款功能,和存款功能类似,也需要使用事务:
```java
public static boolean withdraw(String username, BigDecimal amount) {
String sql1 = "UPDATE customer SET balance = balance - ? WHERE username = ? AND balance >= ?";
String sql2 = "INSERT INTO withdraw (username, amount) VALUES (?, ?)";
try (Connection conn = getConnection();
PreparedStatement stmt1 = conn.prepareStatement(sql1);
PreparedStatement stmt2 = conn.prepareStatement(sql2)) {
conn.setAutoCommit(false);
stmt1.setBigDecimal(1, amount);
stmt1.setString(2, username);
stmt1.setBigDecimal(3, amount);
int rows1 = stmt1.executeUpdate();
if (rows1 != 1) {
conn.rollback();
return false;
}
stmt2.setString(1, username);
stmt2.setBigDecimal(2, amount);
int rows2 = stmt2.executeUpdate();
if (rows2 != 1) {
conn.rollback();
return false;
}
conn.commit();
return true;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
```
上述代码中,我们首先执行取款操作,并检查余额是否充足。如果余额不足,则回滚事务。否则,我们执行记录取款记录操作,并提交事务。
接下来是转账功能,也需要使用事务:
```java
public static boolean transfer(String from, String to, BigDecimal amount) {
String sql1 = "UPDATE customer SET balance = balance - ? WHERE username = ? AND balance >= ?";
String sql2 = "UPDATE customer SET balance = balance + ? WHERE username = ?";
String sql3 = "INSERT INTO transfer (from_customer, to_customer, amount) VALUES (?, ?, ?)";
try (Connection conn = getConnection();
PreparedStatement stmt1 = conn.prepareStatement(sql1);
PreparedStatement stmt2 = conn.prepareStatement(sql2);
PreparedStatement stmt3 = conn.prepareStatement(sql3)) {
conn.setAutoCommit(false);
stmt1.setBigDecimal(1, amount);
stmt1.setString(2, from);
stmt1.setBigDecimal(3, amount);
int rows1 = stmt1.executeUpdate();
if (rows1 != 1) {
conn.rollback();
return false;
}
stmt2.setBigDecimal(1, amount);
stmt2.setString(2, to);
int rows2 = stmt2.executeUpdate();
if (rows2 != 1) {
conn.rollback();
return false;
}
stmt3.setString(1, from);
stmt3.setString(2, to);
stmt3.setBigDecimal(3, amount);
int rows3 = stmt3.executeUpdate();
if (rows3 != 1) {
conn.rollback();
return false;
}
conn.commit();
return true;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
```
上述代码中,我们首先执行转出操作,并检查余额是否充足。如果余额不足,则回滚事务。否则,我们执行转入操作,并记录转账记录,并提交事务。
接下来是修改密码功能:
```java
public static boolean changePassword(String username, String oldPassword, String newPassword) {
String sql = "UPDATE customer SET password = ? WHERE username = ? AND password = ?";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, newPassword);
stmt.setString(2, username);
stmt.setString(3, oldPassword);
int rows = stmt.executeUpdate();
if (rows == 1) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
```
上述代码中,我们首先执行修改密码操作,并检查旧密码是否正确。如果旧密码不正确,则修改失败,否则修改成功。
最后是退出功能,这里我们可以使用System.exit(0)来结束程序:
```java
public static void exit() {
System.exit(0);
}
```
上述代码中,我们直接调用System.exit(0)来结束程序。
整个银行管理系统的代码较长,这里只展示了各个功能的代码片段,具体实现还需要根据具体的需求进行完善。