当前位置:首页 > Java

java如何转账

2026-03-19 21:44:28Java

Java实现转账功能

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

java如何转账

数据库表结构

java如何转账

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类型避免精度问题 实际项目中应添加完善的异常处理和日志记录

标签: java
分享给朋友:

相关文章

如何删除java

如何删除java

卸载 Java 的步骤 Windows 系统: 打开控制面板,选择“程序和功能”或“卸载程序”,在列表中找到 Java 相关条目(如“Java Runtime Environment”或“Java D…

java如何运行程序

java如何运行程序

运行Java程序的步骤 安装Java开发工具包(JDK) 确保系统已安装JDK,可通过命令行输入java -version和javac -version验证。若未安装,需从Oracle官网下载并配置环…

如何搭建java环境

如何搭建java环境

下载JDK 访问Oracle官网或OpenJDK官网下载适合操作系统的JDK安装包。推荐选择长期支持版本(如JDK 17或JDK 21)。 安装JDK 运行下载的安装程序,按照向导完成安装。注意…

java如何实现异步

java如何实现异步

Java实现异步的方法 Java中实现异步编程可以通过多种方式,每种方式适用于不同的场景和需求。以下是常见的实现方法: 使用Thread类 创建新线程执行异步任务是最基础的方式。通过继承Thread…

如何成为java架构师

如何成为java架构师

掌握扎实的Java基础 深入理解Java核心知识,包括多线程、集合框架、JVM原理、设计模式等。熟悉Java生态中的常用框架如Spring、MyBatis、Hibernate等,并能分析其源码实现。…

java版本如何查看

java版本如何查看

查看Java版本的命令行方法 在命令行或终端中运行以下命令可以查看当前安装的Java版本: java -version 输出示例: java version "1.8.0_301" Java(TM…