如何使用 jdbc 模板将值列表作为参数传递给 IN 子句
How to pass list of values as a parameter to IN clause using jdbc template
我想将汽车名称作为绑定变量传递(在运行时更改)如何实现。
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;
}
按照说明使用命名参数 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);
jdbcTemplate.queryForList(
"SELECT NAME, YEAR, TYPE FROM CARS where NAME in (?,?,?)",
new Object[] { "Honda", "Audi", "Benz" }
);
您可能应该将逻辑包装到一个方法中,该方法接受 IN 值并生成适当的问号序列。
一些框架(如 MyBatis)内置了对此的支持。
还要记住,不同的数据库对 IN 列表(或整个查询)的长度有不同的限制。如果您有太多值无法放入 IN 子句,您将不得不处理这个问题(将其分解为 "batches" 适当的大小或完全使用不同的方法)。
我想将汽车名称作为绑定变量传递(在运行时更改)如何实现。
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;
}
按照说明使用命名参数 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);
jdbcTemplate.queryForList(
"SELECT NAME, YEAR, TYPE FROM CARS where NAME in (?,?,?)",
new Object[] { "Honda", "Audi", "Benz" }
);
您可能应该将逻辑包装到一个方法中,该方法接受 IN 值并生成适当的问号序列。
一些框架(如 MyBatis)内置了对此的支持。
还要记住,不同的数据库对 IN 列表(或整个查询)的长度有不同的限制。如果您有太多值无法放入 IN 子句,您将不得不处理这个问题(将其分解为 "batches" 适当的大小或完全使用不同的方法)。