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
相关产品推荐
相关产品推荐

