PreparedStatement.RETURN\u生成的\u密钥和Mysql

PreparedStatement.RETURN\u生成的\u密钥和Mysql,mysql,database,prepared-statement,Mysql,Database,Prepared Statement,我试图修复这段代码,以更新mysql数据库5.6中的日志表 您知道如何从数据库中检索主键并将其分配给我的id变量(Log)吗 谢谢 不带getter和setter的日志模型 private int id; private Timestamp date; private String userName; private String event; private String message; private String audioPath; 数据库表 CREATE TABLE `log` (

我试图修复这段代码,以更新mysql数据库5.6中的日志表 您知道如何从数据库中检索主键并将其分配给我的id变量(Log)吗

谢谢

不带getter和setter的日志模型

private int id;
private Timestamp date;
private String userName;
private String event;
private String message;
private String audioPath;
数据库表

CREATE TABLE `log` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`date` datetime(2) NOT NULL DEFAULT '0000-00-00 00:00:00.00',
`user_name` char(60) NOT NULL,
`event` varchar(50) NOT NULL,
`message` text NOT NULL,
`audio_path` varchar(250) NULL,
 PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1;
添加条目日志

@Override
public int addEntry(Log log) throws SQLException {

    Connection conn = Database.getInstance().getConnection();

    PreparedStatement p = conn.prepareStatement(
            "insert into log ( id, date, user_name, event, message, audio_path) "
            + "values (?,?,?,?,?,?)", 
            PreparedStatement.RETURN_GENERATED_KEYS);

    p.setInt(1, p.getGeneratedKeys()); //error
    p.setTimestamp(2, log.getDate());
    p.setString(3, log.getUserName());
    p.setString(4, log.getEvent());
    p.setString(5, log.getMessage());
    p.setString(6, log.getAudioPath());

    int updated = p.executeUpdate();


    p.close();

    return updated;

}

由于
id
声明为
AUTO_INCREMENT
,因此您无需在查询中提及它:

String sql = "insert into log ( date, user_name, event, message, audio_path) values (?,?,?,?,?)";
这样MySQL将自动生成新的id

那么,你应该这样做:

PreparedStatement ps = connection.prepareStatement(sql, RETURN_GENERATED_KEYS)
ps.setTimestamp(1, log.getDate());
// ...
ps.setString(5, log.getAudioPath());

int updated = ps.executeUpdate();

ResultSet generatedKeysResultSet = ps.getGeneratedKeys();
// first row of this set will contain generated keys
// in our case it will contain only one row and only one column - generated id
generatedKeysResultSet.next(); // executing next() method to navigate to first row of generated keys (like with any other result set)
long id = generatedKeysResultSet.getLong(1); // since our row contains only one column we won't miss with the column index :)

log.setId(id);

return updated;
除此之外,在您尝试使用这个示例之后,我真的建议您使用JDBC正确地关闭MySQL
Connection
PreparedStatement
。请参阅有关如何正确创建和关闭资源的信息


希望这有助于

成功插入生成的自动关键帧值后,可以访问这些值。因此,我们应该只调用
getGeneratedKeys()
post
executeUpdate()
@Yura非常感谢它做了我想要的。我只需将id从int改为long。我应该相应地更改我的数据库表吗?@QuentinTanioartino我很高兴这有帮助!我想说在数据库中只使用
int
,而不是
int(11)
,除非您需要特殊的数字逻辑,如以下问答: