在将Java + mysql与jdbc.Driver一起使用时,我在检索插入的行ID时遇到问题。
public Diak create(Diak diak) throws Exception
{
Connection connection = DBConnection.getConnection();
String SQL = "{ CALL DiakCreate(?, ?) }";
PreparedStatement stmt = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, diak.Nev);
stmt.setInt(2, diak.Kreditek);
int affectedRows = stmt.executeUpdate();
//ellenorizzuk, hogy van e modositott record
if (affectedRows == 0)
{
throw new SQLException("Failure");
}
//kikeressuk a generalt ID-t
ResultSet generatedKeys = stmt.getGeneratedKeys();
if (generatedKeys.next())
{
diak.Id = generatedKeys.getInt(1);
}
else
{
throw new SQLException("Failure");
}
return diak;
}
我尝试了一些在互联网上找到的解决方案。 记录已插入到表中,但是引发了异常,并且没有将ID设置为我的响应对象。
答案 0 :(得分:1)
您需要CallableStatement而不是PreparedStatement
。您可以在互联网上找到许多示例,例如https://www.journaldev.com/2502/callablestatement-in-java-example
String SQL = "{ CALL DiakCreate(?, ?) }";
CallableStatement stmt = connection.prepareCall(SQL);
stmt.setString(1, diak.Nev);
stmt.setInt(2, diak.Kreditek);
int affectedRows = stmt.executeUpdate();
...
...
...
答案 1 :(得分:1)
检查是否为PreparedStatement导入了正确的库。它应该是java.sql.Statement而不是jdbc,这是一个常见错误。
如果正确,请检查PreparedStatement Interface以查看如何在此上下文中使用executeUpdate(String sql,int autoGeneratedKeys)。希望这会有所帮助。
答案 2 :(得分:0)
java:
public Diak create(Diak diak) throws Exception
{
Connection connection = DBConnection.getConnection();
String SQL = "{ CALL DiakCreate(?, ?, ?) }";
CallableStatement stmt = connection.prepareCall(SQL);
stmt.setInt(1, diak.Id);
stmt.setString(2, diak.Nev);
stmt.setInt(3, diak.Kreditek);
ResultSet resultSets = stmt.executeQuery();
if (resultSets.next())
{
diak.Id = resultSets.getInt(1);
}
return diak;
}
MySQL过程:
DELIMITER $$
CREATE OR REPLACE PROCEDURE DiakCreate(OUT paramId INT, IN paramName VARCHAR(255), IN paramKreditek INT)
BEGIN
INSERT INTO
Diak (Nev, Kreditek)
VALUES
(paramName, paramKreditek);
SELECT LAST_INSERT_ID() as paramId;
END$$
DELIMITER ;