2014-05-20 65 views
0

我使用事先準備好的聲明,使刀片在以下方式:準備好的聲明中得到插入行

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

這裏角色ID是主鍵,並且正在通過一些觸發序列內部更新。

我在這裏關心的是插入後我需要獲取已插入的ROLEID。我可以使用一個像select * from ROLEID desc這樣的查詢語句,但是如果我找到這個預處理語句使用的特定id,會更好。

有什麼建議?

+1

看看http://docs.oracle。 com/javase/8/docs/api/java/sql/Connection.html#prepareStatement-java.lang.String-int- –

+0

另一種方法是使用數據庫存儲過程從Java進行插入和調用存儲過程。存儲過程應該有一個OUT參數,它只是你的'ROLEID'。因此,您擁有更大的靈活性,並將所有數據庫邏輯保留在後端。 – user75ponic

回答

0

另一種方法是使用數據庫存儲過程從Java執行插入和調用存儲過程。存儲過程應該有一個OUT參數,它只是你的ROLEID。因此,您擁有更大的靈活性,並將所有數據庫邏輯保留在後端。

假設您的數據庫是Oracle。

E.g.首先創建過程從Java做的插入和返回角色ID

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代碼片斷

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