java获取插入的行ID

时间:2019-11-22 22:35:28

标签: java mysql stored-procedures rowid

在将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设置为我的响应对象。

3 个答案:

答案 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 ;