Java JDBC 插入后检索 ID

4

我使用触发器来设置所有表的主键列值,因此我不在Java中执行任何关于ID的操作,但是我需要在插入后获取ID。

如何获取ID?

stat.execute("INSERT INTO TPROJECT_PROCESS_GROUP(NPROJECT_ID,VDESCRIPTION) " +
                "VALUES(" +
                "'" + projectID + "'," +
                "'" + description + "'" +
                "");

编辑:你好,我又看了一下问题,现在我遇到一个“不支持的操作”异常(我从我的母语翻译过来,确切的英文形式可能有所不同)。我猜这与Oracle是否支持GetGeneratedKeys相关?你知道这方面的情况吗?

解决方法:如一本关于callablestatements的书中所述,该语句可以用于执行存储过程和函数。与PreparedStatement不同,大多数数据库不会为调用进行任何准备工作,因为它是如此简单的命令。CallableStatement实例可用于返回存储过程或函数返回的对象。

OracleConnection conn = null;
    //OraclePreparedStatement pstat = null;
    OracleCallableStatement cstat = null;
    String sql = "BEGIN INSERT INTO TPROJECT P (VPROJECT_TITLE,VPROJECT_DESC)    VALUES(?,?) RETURNING P.NPROJECT_ID INTO ?;  END;";
    try {
        conn = ConnectionUtility.GetConnection();
        cstat = (OracleCallableStatement)conn.prepareCall(sql);

        cstat.setString(1, title);
        cstat.setString(2, description);
        cstat.registerOutParameter(3, OracleTypes.NUMBER);
        cstat.execute();

        int returnedID = cstat.getInt(3);
//          System.out.println(returnedID);

        conn.close();

        return returnedID;

3
请注意,您的语句容易受到 SQL 注入攻击。建议使用 PreparedStatement 代替 Statement。以下是需要翻译的内容:"Duplicate of JDBC : How can we get inserted record ID in Java?" - BalusC
其实,我不确定这是否是一个*完全相同的副本,因为在这里,某种方式使用了触发器。 - erickson
@erickson:在问题的上下文中,这个术语确实是有歧义的,但在底层,MySQL的auto_increment,DB2/MSSQL的identity和Oracle/PostgreSQL的serial都使用触发器。我不明白为什么会为插入ID创建自定义触发器。 - BalusC
是的,我有关于SQL注入和如何防范攻击的信息,但你说得对,这样做更好。这是我在Java中第一次使用数据库应用程序(我是.NET开发人员,在那里LINQ运行良好:P),所以我正在学习。感谢你的建议=) - mehmet6parmak
可能是PLSQL JDBC:如何获取最后一行ID?的重复问题。 - BalusC
我想指出getGeneratedKeys()解决方案也适用于MySQL。 - Sanete
1个回答

6
这个例子是在PostgreSQL中如何实现的。希望你可以在Oracle中类似地做到这一点。
以下是如何获取像serial这样的自动生成键后INSERT INTO的id。重要的是,在prepareStatement()调用中提供RETURN_GENERATED_KEYS
Resultset result;
PreparedStatement prep;
String query = "INSERT INTO myRel (data) VALUES (?)";

prep = db.prepareStatement(query ,Statement.RETURN_GENERATED_KEYS);

result = prep.getGeneratedKeys();

if(result.next() && result != null){
   System.out.println("Key: " + result.getInt(1));
} else {
   System.out.println("No, Nop nada");
}

希望这能帮助到某些人 :)

完全不适用于Oracle。此外,在问题评论的第一个链接中已经提到了这一点。 - BalusC
不,我没有访问Oracle的权限,我正在使用Postgresql。我希望通用原则仍然适用,毕竟它是JDBC。 - Ben
1
此答案不好。请阅读http://stackoverflow.com/questions/1915166/how-to-get-the-insert-id-in-jdbc。 - Flavius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接