java如何转账
Java实现转账功能
转账功能通常涉及数据库操作和事务管理,确保数据一致性。以下是一个基于JDBC和MySQL的简单实现示例:

数据库表结构

CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
balance DECIMAL(10,2) NOT NULL
);
Java转账代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TransferService {
private static final String URL = "jdbc:mysql://localhost:3306/bank";
private static final String USER = "root";
private static final String PASSWORD = "password";
public void transfer(int fromId, int toId, double amount) {
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USER, PASSWORD);
conn.setAutoCommit(false); // 开启事务
// 扣除转出账户金额
String sql1 = "UPDATE account SET balance = balance - ? WHERE id = ? AND balance >= ?";
PreparedStatement ps1 = conn.prepareStatement(sql1);
ps1.setDouble(1, amount);
ps1.setInt(2, fromId);
ps1.setDouble(3, amount);
int rows1 = ps1.executeUpdate();
// 增加转入账户金额
String sql2 = "UPDATE account SET balance = balance + ? WHERE id = ?";
PreparedStatement ps2 = conn.prepareStatement(sql2);
ps2.setDouble(1, amount);
ps2.setInt(2, toId);
int rows2 = ps2.executeUpdate();
if (rows1 == 1 && rows2 == 1) {
conn.commit(); // 提交事务
System.out.println("转账成功");
} else {
conn.rollback(); // 回滚事务
System.out.println("转账失败:余额不足或账户不存在");
}
} catch (SQLException e) {
try {
if (conn != null) conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
try {
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
使用Spring框架实现转账
对于企业级应用,推荐使用Spring框架的事务管理:
@Service
public class AccountService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void transfer(int fromId, int toId, double amount) {
// 检查余额
Double balance = jdbcTemplate.queryForObject(
"SELECT balance FROM account WHERE id = ?",
Double.class, fromId);
if (balance < amount) {
throw new RuntimeException("余额不足");
}
// 执行转账
jdbcTemplate.update(
"UPDATE account SET balance = balance - ? WHERE id = ?",
amount, fromId);
jdbcTemplate.update(
"UPDATE account SET balance = balance + ? WHERE id = ?",
amount, toId);
}
}
注意事项
确保数据库使用InnoDB引擎以支持事务 在高并发场景下考虑添加锁机制防止超发 金额应使用BigDecimal类型避免精度问题 实际项目中应添加完善的异常处理和日志记录






