You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中从ResultSet获取INT值插入数据库失败问题求助

问题分析与解决方案

你遇到的核心问题很明确:你直接把ResultSet对象拼到了INSERT语句里,而不是从ResultSet中取出实际的整数id值。当Java把asset_id这个ResultSet对象转换成字符串时,它会输出对象的类名+哈希值(也就是你看到的com.mysql.cj.jdbc.result.ResultSetImpl@1779d92),而type_id字段需要的是整数类型,所以数据库抛出了类型不匹配的错误。

修复步骤

1. 先从ResultSet中提取实际的id值

首先你需要在遍历ResultSet时,把查询到的id保存到一个变量里,而不是只打印出来:

// 定义变量存储查询到的type_id
int typeId = 0;
ResultSet asset_id = stmt.executeQuery("SELECT id FROM cars.asset_type WHERE asset_type.name = '" + sellables.getValue() + "'");
while (asset_id.next()) {
    typeId = asset_id.getInt("id");
    System.out.println(typeId); // 这里打印的就是正确的整数id了
}

注意:如果你的asset_type.name可能对应多条记录,需要根据业务逻辑处理(比如取第一条、取最后一条或者批量插入),不过通常name应该是唯一的,所以取第一条即可。

2. 用提取到的id值构建INSERT语句

接下来在INSERT语句里使用typeId变量,而不是asset_id对象:

String insert = "INSERT INTO asset (type_id, purchase_price, purchased_at) VALUES ("+ typeId + "," + value +",'" + localDate +"')";

不过这里还有个问题:字符串拼接SQL存在严重的SQL注入风险,而且日期、数值类型的拼接容易出错,更推荐用PreparedStatement来处理。

3. 优化代码:使用PreparedStatement(强烈推荐)

用参数化查询可以避免SQL注入,同时自动处理类型转换,代码也更安全可靠:

public void submit() throws Exception {
    // 使用try-with-resources自动关闭连接、语句、结果集,避免资源泄漏
    try (Connection connection = getConnection();
         PreparedStatement queryStmt = connection.prepareStatement("SELECT id FROM cars.asset_type WHERE name = ?");
         PreparedStatement insertStmt = connection.prepareStatement("INSERT INTO asset (type_id, purchase_price, purchased_at) VALUES (?, ?, ?)")) {
        
        // 设置查询参数
        queryStmt.setString(1, sellables.getValue());
        ResultSet assetRs = queryStmt.executeQuery();
        
        int typeId = 0;
        if (assetRs.next()) { // 因为name唯一,用if代替while更合适
            typeId = assetRs.getInt("id");
            System.out.println(typeId);
        }
        
        // 设置插入参数
        insertStmt.setInt(1, typeId);
        insertStmt.setDouble(2, parseDouble(purchased.getText()));
        insertStmt.setObject(3, purchased_at.getValue()); // LocalDate可以直接用setObject
        
        // 执行插入
        int affectedRows = insertStmt.executeUpdate();
        System.out.println(affectedRows + " 条记录插入成功");
    }
}

额外优化点

  • 使用try-with-resources语法:自动关闭Connection、PreparedStatement、ResultSet,不用手动调用close(),避免资源泄漏。
  • 避免创建多个Statement:用PreparedStatement可以复用,代码更简洁。
  • 用if代替while遍历ResultSet:如果asset_type.name是唯一约束,查询只会返回一条结果,用if更符合业务逻辑。

内容的提问来源于stack exchange,提问作者Vins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:02:16