在我的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向所有人表示耐心和回应。
答案 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);