我是Java数据库编程的新手。 最近在我的项目中,我遇到了一个概念,我搜索了很多,但没有得到任何解决方案来满足我的查询,这可以帮助我摆脱我的问题。
实际上问题是:
我有三个表,比如说一个main(包含实际数据的公共字段)表和两个子表(根据某些条件包含其他不同的字段)。主表包含部分信息,其余信息(取决于某些条件)将仅保存在子表中的一个中。
现在的情况是这样的,我已经设置了autocommit,然后触发一个插入查询。因此,当插入查询将被触发时,数据库将在mysql中为其提供唯一的ID,因为ID feild是autoIncrement。现在触发Select Query,我想从主表中提取该ID。所以,这是我的问题,是否可以选择提取我刚刚保存的特定记录的ID?请记住自动提交设置为false,我还没有提交。
我这样做是因为我希望在其中一个子表中插入该唯一ID,以便我可以关联表之间的信息。因此,在找到ID之后,我再次发出一个新的INSERT查询来保存其中一个子表中的其余数据,现在使用唯一ID和其余数据。然后成功插入,我已经提交了连接。
此外,我希望信息保存在(主要和一个子)表中,或者如果发生任何故障,细节不会完全保存,这样我就不会丢失部分信息。
请帮帮我。如果您可以解释自动提交,保存点之间的关系。何时使用,要记住哪些事情。请提供一些真实的资源,如果可以,它们证明了它们的性质,它们在不同情况下的工作方式等等。我用Google搜索但没有得到任何有用的信息。我想深入了解它。
提前致谢:)
答案 0 :(得分:0)
在将记录添加到表中时,您似乎想要获取ID。如果使用getGeneratedKeys(),则在插入记录时可以使用此选项。自动提交不能用于返回此信息。
以下代码显示了如何完成此操作。
/**
* Insert to database using JDBC 3.0 + which will return the key of the new row.
*
* @param sql is the sql insert to send to the database
* @return the key for the inserted row
* @throws DBSQLException
*/
public static int insertAndReturnKey(Connection dbConnection, String sql, List<SqlField> params) throws DBSQLException
{
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String paramList = null;
try {
preparedStatement = dbConnection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
// Setup your parameters
int result = preparedStatement.executeUpdate();
resultSet = preparedStatement.getGeneratedKeys();
if (resultSet.next()) {
return (resultSet.getInt(1));
} else {
// throw an exception from here
throw new SQLException("Failed to get GeneratedKey for [" + sql + "]");
}
} catch (SQLException ex) {
throw new DBSQLException(buildErrorMessage(ex, sql, params));
} finally {
DBConnector.closeQuietly(preparedStatement);
DBConnector.closeQuietly(resultSet);
}
}