如何得到JDBC Insert 语句执行后插入数据库记录的主键

2024-11-06 07:21:11
推荐回答(1个)
回答(1):

以下代码需要JDBC 3.0 支持。
受限于厂商提供的JDBC驱动程序
代码是来源于一个 叫Roman 的开源持久层组件,仅供你参考,不保证能够直接嵌入你的工程代码,里面的代码被我删除了部分,仅保留了功能实现的基本部分:

//声明需要返回的 主键列名(String 数组)
// instance 是一个po对象 有一个 getPrimaryKeyName的方法,返回这个PO的主键名
String[] generalColumns = new String[]{instance.getPrimaryKeyName()};
//执行更新
ResultSet rsKeys = null;
PreparedStatement s = null;

try
{
s = _cnn.prepareStatement(_insertString,generalColumns);//执行SQL,_cnn 是一个数据库连接

for(int i = 0 ; i < values.size(); i ++)
s.setObject(i+1, values.get(i)); // 写入除了主键外的其它参数

int ref = s.executeUpdate(); //执行
if (ref != 1 ) // 检查是否成功执行了 Insert
throw new SqlRuntimeException(" database inserted nothing ");

rsKeys = s.getGeneratedKeys(); // 接收返回值
ResultSetMetaData rsmd = rsKeys.getMetaData(); // 获取返回的列名
int rscolumnsCount = rsmd.getColumnCount();

//接受数据库端生成的返回值
if (rsKeys.next())
{
Object val = null;
String nam = null;

for(int i = 0; i < rscolumnsCount; i ++ )
{
val = rsKeys.getObject(i + 1); // JDBC 中的参数是从 1 开始的
nam = rsmd.getColumnLabel(i + 1);

instance.setValue(nam, val);
}

}

return instance;

}
catch (SQLException e)
{
throw e;
}
finally
{
if (null != rsKeys)
rsKeys.close();

if (null != s)
s.close();
}