我正在使用预准备语句以下列方式进行插入:
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,会更好。
有什么建议吗?
答案 0 :(得分:0)
在问题评论中对Mark的想法进行了一些阐述,我建议你试试
在触发器中生成,也许你的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代码段
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);