spring jdbc 多List參數查詢,包括包含多個 in 條件查詢情況
其中學生類Student.java extends RowMapper<T> :
private String name;
private String sex;
@Nullable
@Override
public Object mapRow(ResultSet rs, int i) throws SQLException {
if(metaData==null) {
metaData = rs.getMetaData();
}
Student student = new Student();
student.setName(rs.getString("name"));
student.setSex(rs.getString("sex"));
return student;
}
// 省略 get 和 set
1. 直接拼接sql語句
// 需要將字符串拼成這種形式
String names = "'張三', '李四'";
String sexes = "'男', '女'";
String sql = String.format("select * from student where name in (%s) and sex in (%s)", names, sexes);
List<student> students = jdbcTemplate.query(sql, new Object[]{}, new Student());
但是這樣會有sql注入風險,正常情況不建議這麼做。
2. 使用 NamedParameterJdbcTemplate
先將sql語句更改爲:
String sql = "select * from student where name in (:names) and sex in (:sexes)";
再使用MapSqlParameterSource
進行參數配置,
String names = "張三, 李四";
String sexes = "男, 女";
MapSqlParameterSource parameters = new MapSqlParameterSource();
Set<String> nameSet = new HashSet<>();
nameSet.addAll(Arrays.asList(names.split(",")));
Set<String> sexSet = new HashSet<>();
sexSet.addAll(Arrays.asList(sexes.split(",")));
parameters.addValue("names", nameSet);
parameters.addValue("sexes", sexSet);
NamedParameterJdbcTemplate template =
new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());
List<Student> students = template.query(sql, parameters, new Student());
這樣就完美解決spring jdbc中多個in的參數查詢問題而不會有sql注入風險了。
附錄
參考: