Java 如何在JDBC中获取受更新查询影响的所有行?

Java 如何在JDBC中获取受更新查询影响的所有行?,java,mysql,postgresql,jdbc,Java,Mysql,Postgresql,Jdbc,我有一个作业,需要使用PreparedStatement更新记录。一旦记录被更新,我们就知道更新查询返回计数,即受影响的行数 但是,我希望得到的不是计数,而是响应中受更新查询影响的行,或者至少是受影响行的id值列表 这是我的更新查询 UPDATE User_Information uInfo SET address = uInfo.contact_number || uInfo.address where uInfo.user_id between ? AND ?; 通常它会返回受影响行的计

我有一个作业,需要使用
PreparedStatement
更新记录。一旦记录被更新,我们就知道更新查询返回计数,即受影响的行数

但是,我希望得到的不是计数,而是响应中受更新查询影响的行,或者至少是受影响行的id值列表

这是我的更新查询

UPDATE  User_Information uInfo SET address = uInfo.contact_number || uInfo.address where uInfo.user_id between ? AND ?;
通常它会返回受影响行的计数,但在我的例子中,查询应该返回行或所有受影响行的ID

我使用了PostgreSQL的
返回
功能,它可以工作,但在这种情况下对我没有用处

我用过PostgreSQL的返回函数,但对我来说没有用

应该是。也许你只是用错了。此代码适用于我:

sql=“UPDATE table1 SET customer=customer | |“X”,其中客户喜欢“ba%”返回id”;
try(PreparedStatement s=conn.prepareStatement(sql)){
s、 execute();//执行更新
try(ResultSet rs=s.getResultSet()){
//循环返回子句中的行
while(rs.next()){
System.out.println(rs.getInt(“id”);//打印更新行的“id”值
}
}
}
指示如果希望结果集包含整个更新的行,也可以使用
RETURNING*

更新:

正如@CraigRinger在他的评论中所建议的,PostgreSQL JDBC驱动程序实际上也支持UPDATE语句的
.getGeneratedKeys()
,因此这段代码对我也很有用:

sql=“UPDATE table1 SET customer=customer | |“X”,其中客户喜欢“ba%”;
try(PreparedStatement s=conn.prepareStatement(sql,Statement.RETURN\u生成的\u键)){
s、 execute();//执行更新
try(ResultSet rs=s.getGeneratedKeys()){
while(rs.next()){
System.out.println(rs.getInt(1));//打印更新行的“id”值
}
}
}

谢谢,克雷格

您可以使用JDBC的支持来获取生成的密钥。请参阅API方法,然后使用访问结果

规范说“如果SQL语句不是
INSERT
语句,那么驱动程序将忽略数组”,但我认为PostgreSQL的JDBC驱动程序实际上也会使用其他语句类型来满足您的请求

e、 g


否则,如Gord Thompson所述,使用
返回

有两种方法 1.通过传递列名数组或列的索引
prepareStatement
i、 e conn.prepareStatement(sql,新字符串[]{'id','uname'}) 及 2.使用
prepareStatement
中的Statement.RETURN\u生成的\u键

我的代码就是为了这个,也就是说,根据我的要求,我已经开发了我的代码,你可以寻找更好的想法

private static final String UPDATE_USER_QUERY= "UPDATE  User_Information uInfo SET address = uInfo.contact_number || uInfo.address where uInfo.user_id between ? AND ?;";
//pst = connection.prepareStatement(UPDATE_USER_QUERY,columnNames);
pst = connection.prepareStatement(UPDATE_USER_QUERY,Statement.RETURN_GENERATED_KEYS);
ResultSet rst = pst.getGeneratedKeys();
List<UserInformation> userInformationList = new ArrayList<UserInformation>();
UserInformation userInformation;

while (rst.next()){
 userInformation = new UserInformation();

 userInformation.setUserId(rst.getLong("user_id"));
 userInformation.setUserName(rst.getString("user_name"));
 userInformation.setUserLName(rst.getString("user_lName"));
 userInformation.setAddress(rst.getString("address"));
 userInformation.setContactNumber(rst.getLong("contact_number"));
 userInformationList.add(userInformation);
}
private static final String UPDATE_USER_QUERY=“UPDATE USER_Information uInfo SET address=uInfo.contact_number | | uInfo.address其中uInfo.USER_id介于?和?;”;
//pst=connection.prepareStatement(更新用户查询,列名称);
pst=连接.prepareStatement(更新用户查询、语句.返回生成的密钥);
ResultSet rst=pst.getGeneratedKeys();
List userInformationList=newarraylist();
用户信息用户信息;
while(rst.next()){
userInformation=新的userInformation();
userInformation.setUserId(rst.getLong(“用户id”);
userInformation.setUserName(rst.getString(“用户名”);
userInformation.setUserLName(rst.getString(“user_lName”);
userInformation.setAddress(rst.getString(“地址”);
userInformation.setContactNumber(rst.getLong(“联系人号码”);
userInformationList.add(userInformation);
}
我认为在这种情况下我需要达到的目标。
希望这将对您有很大帮助。

您可以使用相同的参数执行select语句,然后再执行更新。感谢您的评论,但一旦我的更新查询运行,它将返回结果集,然后从第一个select语句中获取id,执行更新,然后使用您获得的id执行select语句。Update语句总是返回受影响的行数。您可以直接使用
RETURNING
,但不需要。JDBC生成的密钥接口允许您通过标准JDBCAPI请求相同的信息。(哦,除了规范说它对于非插入查询是被忽略的,别担心)。@CraigRinger Not true,JDBC 4.2(第13.6节)说:“JDBC驱动程序必须支持SQL INSERT语句自动生成值的返回。一些JDBC驱动程序实现可能还支持SQL语句而不是INSERT语句自动生成值。”。换句话说:
插入需要支持,其他DML可选。但API文档中的措辞似乎令人困惑。返回仅适用于postgress我已经尝试过使用返回条款,但我需要其他解决方案,不幸的是,所有建议都提到她不适用于meThe文档说“如果SQL语句不是INSERT语句,或者不是能够返回自动生成键的SQL语句(此类语句的列表是特定于供应商的),则驱动程序将忽略该数组。”。“在or前面出现逗号会让人有点困惑,但这意味着除了
INSERT
之外,其他语句都可以支持逗号。是的,IIRC PgJDBC会盲目地将
RETURNING
附加到您通过
PrepareStatement
发送的几乎所有内容上,并生成密钥。包括那些在句法上毫无意义的东西。我对Jaybird/Firebird也有同样的问题。事实证明,某些应用程序(看着你,ColdFusion)总是使用
语句。返回生成的\u键
,甚至用于查询。
private static final String UPDATE_USER_QUERY= "UPDATE  User_Information uInfo SET address = uInfo.contact_number || uInfo.address where uInfo.user_id between ? AND ?;";
//pst = connection.prepareStatement(UPDATE_USER_QUERY,columnNames);
pst = connection.prepareStatement(UPDATE_USER_QUERY,Statement.RETURN_GENERATED_KEYS);
ResultSet rst = pst.getGeneratedKeys();
List<UserInformation> userInformationList = new ArrayList<UserInformation>();
UserInformation userInformation;

while (rst.next()){
 userInformation = new UserInformation();

 userInformation.setUserId(rst.getLong("user_id"));
 userInformation.setUserName(rst.getString("user_name"));
 userInformation.setUserLName(rst.getString("user_lName"));
 userInformation.setAddress(rst.getString("address"));
 userInformation.setContactNumber(rst.getLong("contact_number"));
 userInformationList.add(userInformation);
}