理想是做全栈工程师 2023-10-26 17:23 采纳率: 37.5%
浏览 8

javaweb对数据库操作报错问题

idea这个报错是什么意思,数据库连接成功,对数据进行删除也是可以的,但是每次进行完操作就会报错Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate(), Statement.executeLargeUpdate() or Connection.prepareStatement().

img


数据库表中主键fid是自增的

protected int executeUpdate(String sql , Object... params){
        boolean insertFlag = false ;
        insertFlag = sql.trim().toUpperCase().startsWith("INSERT");
        try {
            conn = getConn();
            if(insertFlag){
                psmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            }else {
                psmt = conn.prepareStatement(sql);
            }
            setParams(psmt,params);
            int count = psmt.executeUpdate() ;

            rs = psmt.getGeneratedKeys();
            if(rs.next()){
                return ((Long)rs.getLong(1)).intValue();
            }
            return count ;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            close(rs,psmt,conn);
        }
        return 0;
    }

这是父类执行sql语句的方法,是不是删除时创建了新的自增主键导致冲突?

  • 写回答

2条回答 默认 最新

  • 呈两面包夹芝士 2023-10-26 17:31
    关注

    引自讯飞星火 如有帮助 还望采纳

    这个报错意味着在执行数据库操作时,没有请求生成的主键。你需要在执行Statement.executeUpdate()Statement.executeLargeUpdate()Connection.prepareStatement()方法时指定Statement.RETURN_GENERATED_KEYS参数。

    为了解决这个问题,你可以在执行更新操作后,使用getGeneratedKeys()方法获取生成的主键。以下是一个示例:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class Main {
        public static void main(String[] args) {
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "password";
            String sql = "DELETE FROM users WHERE id = ?";
    
            try (Connection connection = DriverManager.getConnection(url, user, password);
                 PreparedStatement preparedStatement = connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS)) {
    
                preparedStatement.setInt(1, 1); // 设置要删除的用户ID
                int affectedRows = preparedStatement.executeUpdate();
    
                if (affectedRows > 0) {
                    try (ResultSet generatedKeys = preparedStatement.getGeneratedKeys()) {
                        if (generatedKeys.next()) {
                            System.out.println("生成的主键为: " + generatedKeys.getLong(1));
                        } else {
                            throw new SQLException("没有获取到生成的主键");
                        }
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    

    在这个示例中,我们首先创建了一个PreparedStatement对象,并指定了PreparedStatement.RETURN_GENERATED_KEYS参数。然后,我们执行更新操作,并在操作完成后使用getGeneratedKeys()方法获取生成的主键。

    评论

报告相同问题?

问题事件

  • 修改了问题 10月26日
  • 创建了问题 10月26日