当前位置:首页 > 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程序的方法 安装Java开发工具包(JDK) 确保系统已安装JDK。可通过命令行输入 java -version 检查是否安装。若未安装,需从Oracle官网或OpenJDK下载并配置环境…

java如何输入

java如何输入

使用Scanner类进行输入 Scanner类是Java中最常用的输入工具,适用于从控制台或文件读取数据。需要导入java.util.Scanner包。 基本语法: Scanner sca…

java如何调用接口

java如何调用接口

调用接口的基本方法 在Java中调用接口通常涉及实现接口或使用接口引用对象。以下是几种常见场景的示例: 定义接口 public interface MyInterface { void d…

如何编译java文件

如何编译java文件

安装JDK 确保系统已安装Java Development Kit(JDK)。可通过命令行输入 javac -version 和 java -version 验证。若未安装,需从Oracle或Open…

java如何生成随机数

java如何生成随机数

生成随机数的方法 在Java中生成随机数可以通过多种方式实现,以下是几种常见的方法: 使用Math.random()方法 Math.random()方法返回一个double类型的伪随机数,范围在[0…

java如何返回数组

java如何返回数组

返回数组的方法 在Java中,可以通过多种方式返回数组。以下是几种常见的方法: 直接返回数组 定义一个方法,返回类型为数组类型,直接在方法内部创建并返回数组。 public int[] getI…