java.sql.SQLException: Generated keys not requested. You need to ... 错误

本文介绍了一种在使用MySQL数据库进行数据插入操作时遇到的关于主键自增ID获取失败的问题及其解决办法。主要原因是PreparedStatement未正确配置以返回生成的键。通过添加额外参数Statement.RETURN_GENERATED_KEYS至prepareStatement方法,可以成功获取到自增ID。

主要方法

/**
* 添加一条数据
* @param bean
*/
public void add(Category bean){
String sql=”insert into category values(null,?)”;
try (Connection connection = DBUtil.getConnction();
PreparedStatement preparedStatement=connection.prepareStatement(sql);
) {
preparedStatement.setString(1,bean.getName());
preparedStatement.execute();
//获得主键id号
ResultSet resultSet=preparedStatement.getGeneratedKeys();
if(resultSet.next()){
int id=resultSet.getInt(1);
bean.setId(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
}

错误详情

java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate(), Statement.executeLargeUpdate() or Connection.prepareStatement().

原因

从5.1.7版本之后的mysql-connector增加了返回GeneratedKeys的条件,如果需要返回GeneratedKeys,则PreparedStatement需要显示添加一个参数Statement.RETURN_GENERATED_KEYS。

PreparedStatement preparedStatement=connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);

修改代码

/**
* 添加一条数据
* @param bean
*/
public void add(Category bean){
String sql=”insert into category values(null,?)”;
try (Connection connection = DBUtil.getConnction();
//修改部分
PreparedStatement preparedStatement=connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
) {
preparedStatement.setString(1,bean.getName());
preparedStatement.execute();
//获得主键id号
ResultSet resultSet=preparedStatement.getGeneratedKeys();
if(resultSet.next()){
int id=resultSet.getInt(1);
bean.setId(id);
}
} catch (SQLException e) {
e.printStackTrace();
}
}

成功运行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值