【问题标题】:Java JDBC Retrieve ID After Insert插入后 Java JDBC 检索 ID
【发布时间】:2011-03-28 00:04:34
【问题描述】:

我使用触发器来设置所有表的 PK 列值,因此我不对 java 中的 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;

【问题讨论】:

  • Duplicate of JDBC : How can we get inserted record ID in Java? 请注意,您的语句对 SQL 注入很敏感。你应该更喜欢PreparedStatement 而不是Statement
  • 实际上,我不确定这是否是精确重复,因为这里不知何故使用了触发器。
  • @erickson:这个词在问题上下文中确实是模棱两可的,但在幕后,MySQL auto_increment、DB2/MSSQL identity 和 Oracle/PostgreSQL serial 都在使用触发器。我不明白为什么要为插入 ID 创建一个自定义。
  • 是的,我有关于 sql 注入和防止其他地方攻击的信息,但你说得对,那就更好了,这是我在 java 中的第一个 db 应用程序体验(我是 .net 开发人员 LINQ 在那里工作正常: P)所以我正在学习感谢您的建议=)

标签: java jdbc insert


【解决方案1】:

这个例子是你在 PostgreSQL 中的做法。希望您可以在 Oracle 中做类似的事情。

这是您在 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。另外,问题 cmets 的第一个链接中已经提到了这一点。
  • 不,我无权访问 Oracle,我使用的是 Postgresql。我希望无论如何都能应用一般原则,毕竟它是 JDBC。
  • 这个答案很糟糕。阅读stackoverflow.com/questions/1915166/…
猜你喜欢
  • 2012-10-29
  • 2011-01-15
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2014-08-08
  • 2011-05-13
  • 2010-12-31
相关资源
最近更新 更多