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