javaweb学习笔记 插入数据后返回自增id

execute、executeQuery和executeUpdate之间的区别

  • execute
    如果第一个结果是 ResultSet 对象,则返回 true;如果第一个结果是更新计数或者没有结果,则返回 false。也就是说如果是查询的话返回true,如果是更新或插入的话就返回false了。

    • 可用于执行返回多个结果集、多个更新计数或二者组合的语句。
    • 调用 getResultSet 或 getUpdateCount 方法来检索结果
    • 调用 getMoreResults 移动到任何后面的结果。
    • 调用方法 getUpdateCount,将返回一个整数。这个整数为调用语句所影响的行数;如果为 -1 则表示结果是结果集或没有结果。
      • 若返回值为-1,且getResultSet() 已返回 null,则表是没有结果
      • Statement.getUpdateCount()==-1&& Statement.getMoreResults()==true的话表明当前statement对象正指向一个真正的结果集
    • 假定已知某个过程(执行多条sql)返回两个结果集,则在使用方法 execute执行该过程后,必须调用方法getResultSet获得第一个结果集,然后调用适当的getXXX方法获取其中的值。要获得第二个结果 集,需要先调用getMoreResults方法,然后再调用getResultSet方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用getMoreResults,并再次调用getUpdateCount。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      // int rowCount = stmt.getUpdateCount();
      ResultSet rs = stmt.getResultSet();
      //获取第一个结果集
      if (rs != null) {
      while (rs.next()) {
      // ...
      }
      //获取第二个结果集,必须先调用getMoreResults(),再调用getResultSet()
      while(stmt.getMoreResults()){
      if(rs.getUpdateCount()==-1){ //执行语句后返回了结果集(尽管为空)
      ResultSet rs = stmt.getResultSet();
      while (rs.next()) {
      // 处理结果
      }
      }else{
      System.out.println(rs.getUpdateCount()) // 没有返回结果集,则输出执行该某语句后所影响的数据行数(如insert、update等)
      }
      }
  • executeQuery
    用于产生单个结果集的语句,例如 SELECT 语句。

    1
    2
    3
    4
    5
    ResultSet resultSet = statement.executeQuery(sql);
    if(resultSet.next()) {
    bookBean.setId(resultSet.getInt("id"));
    // ……
    }
  • executeUpdate

    • 返回值是一个整数,指示受影响的行数(即更新计数stmt.getUpdateCount();
    • 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。

如何执行插入操作后返回自增id

1
2
3
4
5
6
7
8
// Statement.RETURN_GENERATED_KEYS表示返回自动生成的键的标志
// Statement.NO_GENERATED_KEYS表示不返回
PreparedStatement ps=con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();
ResultSet rs=ps.getGeneratedKeys();//获取自动生成的键
while(rs.next()){
id=rs.getInt(1);
}

参考链接

JDBC介绍(详细版)
理解JBDC更新计数行以及调用存储过程返回多个结果集