2017-04-10 48 views
0

JDBCのトレーニングでは、where句の使用について質問があります。java Spring JDBCTemplate - where句

jdbcテンプレートを使用してSpringアプリケーションを使用して管理したいテーブルがデータベースにあるとします。このカラムを使用して、「logbase」としましょう。host、user、clientip私は分離を書かなければならないとし

Select * from Logbase where host = x 

Select * from Logbase where user = y 

Select * from Logbase where clientip = z 

:つまり、私はすべての列の単一の列に基づいてクエリのDBを許可したいと今と仮定このクエリのすべての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つのパラメータに基づいてクエリdbを許可したい場合は、3つのパラメータのペア(clientip-user、clientip-host、user-hostの3つ)のメソッドを記述する必要があります。

最後に、すべてのパラメータを選択できるようにするには、クエリ内のwhere句を使用してすべての変数を要求する別のメソッドを記述する必要があります。

私が異端を言っておらず、すべてが正しければ、私には7つの方法があります。しかし、私はパラメータと組み合わせの数が増え、これが問題になる可能性があります。それを回避する方法はありますか?

注:作業上の理由から、私はHibernateまたは他のORMフレームワークを使用できません。私はjdbcを使用しなければならない。

忍耐と応答のためにすべてにTnx。

答えて

0

溶液はuserがあるのであれば、例えばSQL

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

jdbcTemplate.queryForObject(SQL、新しいオブジェクトは[] {ホスト、ホスト、ユーザ、ユーザ、clienttip、clienttip}

に基づくことができます(ユーザがnullである - 真)指定されていないので、すべてのレコードが

+0

おかげスタニスラフ、私はこれを試してみましょう。私はただ一つのことを理解していない:なぜ、queryForObjectメソッドの呼び出しで、我々はすべての変数を2回書くか? Thasは{host、user、clienttip}ではなく{host、host、user、user、clienttip、clienttip}なのですか? –

+0

私たちは6つのパラメータを持っているので、6つの値を与えなければなりません。それぞれを代用するとしますか? 1つのパラメータで – StanislavL

+0

Tnx、verクリア。私はとても感謝しています。 –

0

を含まれている、あなたはまた、org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate

を使用することができます0
** 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);