spring jdbc 多List参数查询,包括包含多个 in 条件查询情况
其中学生类Student.java extends RowMapper :
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 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 nameSet = new HashSet<>();
nameSet.addAll(Arrays.asList(names.split(",")));
Set sexSet = new HashSet<>();
sexSet.addAll(Arrays.asList(sexes.split(",")));
parameters.addValue("names", nameSet);
parameters.addValue("sexes", sexSet);
NamedParameterJdbcTemplate template =
new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());
List students = template.query(sql, parameters, new Student());
这样就完美解决spring jdbc中多个in的参数查询问题而不会有sql注入风险了。
附录
参考: