spring jdbc 多List参数查询,包括包含多个 in 条件查询情况

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注入风险了。

附录

参考:

  1. https://stackoverflow.com/questions/1327074/how-to-execute-in-sql-queries-with-springs-jdbctemplate-effectivly
  2. https://www.baeldung.com/spring-jdbctemplate-in-list
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章