【问题标题】:prepared statement get inserted row准备好的语句获取插入的行
【发布时间】:2014-05-20 18:17:08
【问题描述】:

我正在使用准备好的语句以下列方式进行插入:

String query = "Insert into ROLE (ROLEID,ROLENAME,TYPEID,UPDATETIMESTAMP) values     (?,?,?,?)";
Class.forName(driver);
        conn = DriverManager.getConnection(url, userName, password);
        preparedStatement = conn.prepareStatement(query);
        preparedStatement.setInt(1, 0);
        preparedStatement.setString(2, roleName);
        preparedStatement.setInt(3, roleId);
        preparedStatement.setTimestamp(4,null);
        preparedStatement.executeUpdate();

这里 ROLEID 是主键,并通过某个触发器在内部由序列更新。

我关心的是插入后我需要获取已插入的 ROLEID。我可以使用 select * from order by ROLEID desc 之类的查询,但如果我找出这个准备好的语句使用的特定 id 会更好。

有什么建议吗?

【问题讨论】:

  • 另一种方法是使用数据库存储过程进行插入并从 Java 调用存储过程。存储过程应该有一个 OUT 参数,它只是你的ROLEID。因此,您拥有更大的灵活性并将所有数据库逻辑保留在后端。

标签: jdbc prepared-statement


【解决方案1】:

另一种方法是使用数据库存储过程进行插入并从 Java 调用存储过程。存储过程应该有一个 OUT 参数,它只是你的 ROLEID。因此,您拥有更大的灵活性,并将所有数据库逻辑保留在后端。

假设您的数据库是 Oracle。

例如首先创建过程进行插入并返回roleid

CREATE SEQUENCE role_seq;

CREATE OR REPLACE PROCEDURE p_proc (
   p_rolename          IN     T_ROLE.ROLENAME%TYPE,
   p_typeid            IN     T_ROLE.TYPEID%TYPE,       
   o_roleid            OUT T_ROLE.ROLEID%TYPE)
IS
BEGIN
   INSERT INTO t_role (roleid,
                     rolename,
                     typeid,
                     updatetimestamp)
        VALUES (role_seq.NEXTVAL,
                p_rolename,
                p_typeid,
                sysdate)
     RETURNING roleid
          INTO o_roleid;               
END;

并使用callableStatement从Java调用上述过程

Java代码sn-p

CallableStatement callablestatement = null;

callablestatement = 
                    connection.prepareCall("{call p_proc(?,?,?)}");
callablestatement.setString(1, 'Test');
callablestatement.setString(2, 'TestType');
callablestatement.registerOutParameter(3, java.sql.Types.INTEGER);

callablestatement.executeUpdate();
int roleId= callablestatement.getInt(3);

【讨论】:

    【解决方案2】:

    在问题cmets中详细说明Mark的想法,我建议你尝试

    http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#execute-java.lang.String-java.lang.String:A-

    在触发器中生成,也许您的 jdbc 驱动程序可能需要一点帮助才能正确识别生成的密钥

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-02
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多