- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试修复此代码以更新我在 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
。请引用this answer关于如何正确创建和关闭资源。
希望对你有帮助
关于mysql - PreparedStatement.RETURN_GENERATED_KEYS 和 Mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26097451/
prepareStatement(String sql, int autoGeneratedKeys) 之间有什么区别?和 prepareStatement(String sql, String[]
我正在使用适用于 sqlite 的 Xerial 最新 jdbc 驱动程序(版本 3.7.2),它似乎不支持语句 RETURN_GENERATED_KEYS。我不断在 SQLException 中收到
我试图在执行 SQL 插入时将标识列返回给我的 java 程序。运行代码时出现以下错误 Uncaught exception thrown in one of the service meth
JDBC 允许我们使用以下语法获取数据库自动生成的主键的值(例如 IDENTITY、AUTO_INCREMENT): PreparedStatement ps= connection.prepareS
带有返回生成键的准备语句正在为单次插入返回自动生成的键,但不适用于批量插入。有没有办法在插入过程中获取自动生成的值。 PreparedStatement ps = connection.pre
在我的数据库中插入一些数据后,我试图获取插入 ID。 String sql = "INSERT INTO ADI.DUMMY(dummy_data) VALUES('from database log
我在 JSP 中指定了以下 MySQL 查询。当我将项目从 MySQL 迁移到 Oracle DB 时,我想找出一个可以针对 Oracle 数据库正确运行的等效查询。 这个“clips”表的主键是“c
我正在尝试修复此代码以更新我在 mysql 数据库 5.6 中的日志表你知道如何从数据库中检索主键并将其分配给我的id变量(Log) 谢谢 没有 getter 和 setter 的日志模型 priva
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: How to get the insert ID in JDBC? 在下面的语句中,如何获取最后插入的 C12 标识
这是有问题的代码块: String sq = "INSERT INTO survey (session_id, character_id, timestamp) VALUES (?,?,?)"; Pr
某些 JDBC 驱动程序返回 Statement.RETURN_GENERATED_KEYS 的唯一方法是执行以下操作: long key = -1L; Statement statement = c
我曾经执行这个查询没有任何问题,但最近我遇到了异常。 (在 mysql 服务器上) 48442 [NioProcessor-1] ERROR c.x.xpofacebook.mysql.MysqlDb
我使用 Statement.RETURN_GENERATED_KEYS 一个接一个地运行两个 INSERT sql 调用,每个插入都有自己的唯一 ID 分配给它。 每个调用都是用 connection
我想批量执行 2 条 sql 语句。第一个语句是一个插入,它使用自动生成的值作为其 ID。第二条语句是对另一个表的插入,但它需要使用上面自动生成的值作为插入值的一部分 类似的东西(其中 id 只是为了
这是我的示例代码行 String query = "INSERT INTO tb_product_group values(?,?,?,?,?) ON DUPLICATE KEY UPDATE prg
import java.sql.* ; import java.util.* ; import java.io.* ; class DataBaseFactory{ public static
我是一名优秀的程序员,十分优秀!