JdbcTemplate的可选参数

罗宾:

我使用Spring的JdbcTemplate。


我有一种情况,其中需要的参数传递到我的查询功能,是有条件的/可选的。例如,我有以下代码:

List<RealTimeDTO> result = jdbcTemplate.query(sql, new Object[] {custId, 
number, requestType, startDate, endDate}, new CCCRowMapper());

在代码中,我通过了custId, number, requestType, etc.。然而,requestType就是可能会回来作为可选的参数null或者empty,所以我不希望它被传递到你Object[],如果它要么是nullempty

我能做些什么来处理这种情况?

我介绍的逻辑,我只有在我想要到的参数传递Object[],但是,我想知道是否有一个已经内置的功能来处理这不是我重新发明轮子。

安德烈亚斯:

一种选择是使用NamedParameterJdbcTemplate,所以参数“表”(现在Map并不需要进行修改),只有SQL的功能:

List<RealTimeDTO> query(String name) {
    NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);

    String sql = "SELECT foo, bar" +
                  " FROM FooBar" +
                 " WHERE name" + (name == null ? " IS NULL" : "= :name");
    Map<String, Object> params = new HashMap<>();
    params.put("name", name);
    return jdbcTemplate.query(sql, params, new CCCRowMapper());
}

UPDATE

如果您有可能需要跳过很多条件,而且所有条件可能会被淘汰,然后使用StringJoiner来构建WHERE子句:

List<RealTimeDTO> query(String name, String phone, int age) {
    NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);

    StringJoiner where = new StringJoiner(" AND ", " WHERE ", "").setEmptyValue("");
    if (name != null)
        where.add("name = :name");
    if (phone != null)
        where.add("phone = :phone");
    if (age != 0)
        where.add("age = :age");
    String sql = "SELECT foo, bar" +
                  " FROM FooBar" +
                  where;
    Map<String, Object> params = new HashMap<>();
    params.put("name", name);
    params.put("phone", phone);
    params.put("age", age);
    return jdbcTemplate.query(sql, params, new CCCRowMapper());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章