准备好的语句插入行

时间:2014-05-20 18:17:08

标签: jdbc prepared-statement

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

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。我可以通过ROLEID desc使用select * from order这样的查询,但如果我找到这个预准备语句使用的特定id,会更好。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

在问题评论中对Mark的想法进行了一些阐述,我建议你试试

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

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

答案 1 :(得分:0)

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

假设您的数据库是Oracle。

E.g。首先创建执行插入和返回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代码段

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);