如何使用jdbc模板将值列表作为参数传递给IN子句

时间:2017-08-15 15:46:17

标签: java jdbctemplate

我想将汽车名称作为绑定变量传递(在运行时更改)如何实现。

Java版本1.7

private JdbcTemplate jdbcTemplate;

 public Collection<Cars> findAll(){

 String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in ('Honda','Audi','Benz')";
        List<Cars> carsList = new ArrayList<Cars>();
        List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
        for (Map row : rows) {
            Cars car = new Cars();
            car.setName(String.valueOf(row.get("NAME")));
            car.setType(String.valueOf(row.get("TYPE")));
            car.setYear(String.valueOf(row.get("YEAR")));

            carsList.add(car);
        }
        return carsList;
    }

2 个答案:

答案 0 :(得分:9)

按照here所述使用命名参数,例如:

String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (:cars)";
List<Cars> carsList = new ArrayList<Cars>();
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(datasource);
List<String> carNames = new ArrayList<String>();
for(Car car : carList){
    carNames.add(car.getName());
}
SqlParameterSource namedParameters = new MapSqlParameterSource("cars", carNames);
namedParameterJdbcTemplate.queryForObject(sql, namedParameters, ResponseType.class);

答案 1 :(得分:1)

jdbcTemplate.queryForList(
    "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (?,?,?)",
    new Object[] { "Honda", "Audi", "Benz" }
);

您应该将逻辑包装到接受IN值并生成适当的问号序列的方法中。

某些框架(如MyBatis)内置了对此的支持。

另请注意,不同的数据库对IN列表(或整个查询)的长度有不同的限制。如果要在IN子句中放入太多值,则必须处理此问题(将其分解为&#34;批次&#34;适当大小或完全使用不同的方法)。