【问题标题】:JDBCTemplate find if row existsJDBCTemplate 查找行是否存在
【发布时间】:2018-12-02 01:09:29
【问题描述】:

我很好奇我应该如何使用 springs jdbctemplate 类来确定我的一个表中是否已经存在记录或行?我试过了

int count = jdbcTemplate.queryForObject("select * from MyTable
                                  where Param = ?", new Object[] {myParam},
                                  Integer.class);
if(count ==0)
    //record does not exist

问题是虽然我不断收到EmptyResultAccessDataException 的任何一个,但当它不存在时,我将代码更新为

try{
    jdbcTemplate.queryForObject("select * from MyTable
                                  where Param = ?", new Object[] {myParam},
                                  Integer.class);
} catch(EmptyResultAccessDataException e) {//insert the record}

如果记录确实存在,这会给我带来问题。所以我想我真正的问题是在表中搜索记录存在的最佳方法是什么,因为如果没有,我想添加所述记录,如果有,则什么也不做。

【问题讨论】:

    标签: spring jdbc jdbctemplate


    【解决方案1】:

    你可以这样使用:

    String sql = "SELECT count(*) FROM MyTable WHERE Param = ?";
    boolean exists = false;
    int count = getJdbcTemplate().queryForObject(sql, new Object[] { "paramValue" }, Integer.class);
    exists = count > 0;
    

    安杰洛

    【讨论】:

    • 我很好奇,这看起来和我的第一次尝试非常相似,我也有一个布尔标志。我看到的唯一主要区别是您的 sql 语句。我绝不是 sql 专家,我可能对它有功能性的理解。 count(*) 在做什么??
    • count(*)语句是SQL统计记录的方式。在您的示例中,您正在尝试检索与您的条件匹配的所有记录。因此,在您的情况下,您不是在计数,而是在检索,您应该使用 queryForList 方法。如果您对只计算需要使用的记录感兴趣,请使用count(*) 语句。可以在此处找到有关计数(和其他)语句的信息w3schools.com/sql/sql_count_avg_sum.asp
    • 不错的方法,只需测试count: if(count>0),而不是制作布尔标志。
    • 如果您只是在寻找存在,则无需计算行数。 SELECT 1 FROM table WHERE email = ? LIMIT 1 会做更少的工作。如果没有匹配,它将提前返回一行或零行。
    • @AngeloImmediate 这很糟糕。如果我只需要做一次,为什么还要点击 DB 两次?
    【解决方案2】:

    使用 JdbcTemplate 中的 query 方法更适合这种情况,因为它们允许返回零行(无 EmptyResultDataAccessException):

    boolean hasRecord =
      jdbcTemplate
        .query("select 1 from MyTable where Param = ?",
          new Object[] { myParam },
          (ResultSet rs) -> {
            if (rs.next()) {
              return true;
            }
            return false;
          }
        );
    

    【讨论】:

      【解决方案3】:

      如果数据库支持存在(例如 Postgres),最好使用它:

      String query = "SELECT EXISTS(SELECT * FROM table_name WHERE ...)";
      boolean exists = jdbcTemplate.queryForObject(query, params, Boolean.class);
      

      Fastest check if row exists in PostgreSQL

      【讨论】:

      • 虽然我感谢您为回答问题所做的努力,但您的解决方案并不通用。很多人使用 oracle 、 pirace 、 Miracle 等。他们呢?
      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多