java Spring JDBCTemplate - where子句

时间:2017-04-10 08:35:49

标签: spring jdbctemplate

在我的JDBC培训中,我对使用where子句有疑问。

假设我的数据库中有一个表,我希望使用jdbc模板管理spring应用程序,让我们假设" Logbase",使用此列:host,user,clientip。现在假设我想要基于所有列的单个列允许查询db,即:

Select * from Logbase where host = x

Select * from Logbase where user = y

Select * from Logbase where clientip = z

我想我必须为每个查询编写一个单独的java方法,如下所示:

 public Logbase getLogbaseFromHost(String id) 
       {
          String SQL = "select * from Logbase where host = ?";
          Logbase logbase = (Logbase) jdbcTemplate.queryForObject(SQL,  new Object[]{id}, 
                  (rs, rowNum) -> new Logbase(rs.getString("host"), rs.getString("user"),
                  rs.getInt("clientip")));

          return logbase;
       }



public Logbase getLogbaseFromUser(String id) 
       {
          String SQL = "select * from Logbase where user = ?";
          Logbase logbase = (Logbase) jdbcTemplate.queryForObject(SQL,  new Object[]{id}, 
                  (rs, rowNum) -> new Logbase(rs.getString("host"), rs.getString("user"),
                  rs.getInt("clientip")));

          return logbase;
       }




public Logbase getLogbaseFromClientIP(String id) 
           {
              String SQL = "select * from Logbase where clientip = ?";
              Logbase logbase = (Logbase) jdbcTemplate.queryForObject(SQL,  new Object[]{id}, 
                      (rs, rowNum) -> new Logbase(rs.getString("host"), rs.getString("user"),
                      rs.getInt("clientip")));

              return logbase;
           }

现在,如果我想基于2个参数允许查询数据库,我想我必须为3个可能的参数对编写一个方法(一个用于clientip-user,另一个用于clientip-host,最后一个用于用户主机) 。

最后,如果我想要允许查询db选择所有参数,我必须在查询中使用where子句编写另一个方法来请求所有变量。

如果我没有说异端邪说,一切都是正确的,我有7种方法。但是,我参数和组合的数量增加,这可能是一个问题。有办法解决它吗?

注意:出于工作原因,我无法使用Hibernate或其他ORM框架。我必须使用jdbc。

Tnx向所有人表示耐心和回应。

2 个答案:

答案 0 :(得分:1)

解决方案可以基于SQL

Select * 
from Logbase 
where 
   (? is null or host = ?)
   AND (? is null or user = ?)
   AND (? is null or clientip = ?)

jdbcTemplate.queryForObject(SQL,new Object [] {host,host,user,user,clienttip,clienttip}

所以,例如如果未指定user(user为null - true),则包含所有记录

答案 1 :(得分:0)

所以,你也可以使用org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate

** Select *
   from Logbase where
        (:host is null or host = :host)
        AND (:user is null or user = :user)
        AND (:clientip is null or clientip = :clientip)**

和java代码:

        MapSqlParameterSource params = new MapSqlParameterSource();
        params.addValue("host", host);
        params.addValue("user", user);
        params.addValue("clientip", clientip);
        namedParameterJdbcTemplate.queryForObject(sqlQuer, params);