JdbcTemplate中如何进行参数绑定?

JdbcTemplate支持使用PreparedStatement的参数绑定,主要有两种方式:

  1. 使用?作为参数占位符,在执行SQL语句时传入参数值:
String sql = "SELECT * FROM user WHERE name = ? AND age > ?";
List<User> users = jdbcTemplate.query(sql, 
    new Object[] {"John", 30}, 
    (rs, rowNum) -> new User(rs.getString("name"), rs.getInt("age"))
);
  • ?作为参数占位符,查询时传入John30作为参数值绑定。
  1. 使用NamedParameterJdbcTemplate以键值对的方式传入参数:
String sql = "SELECT * FROM user WHERE name = :name AND age > :age";
Map<String, Object> param = new HashMap<>();
param.put("name", "John");
param.put("age", 30);  
List<User> users = namedParameterJdbcTemplate.query(sql, param, 
    (rs, rowNum) -> new User(rs.getString("name"), rs.getInt("age"))
);
  • :name和:age作为命名参数占位符,以键值对的方式传入参数绑定。

参数绑定的主要好处是防止SQL注入,因为参数值不会被当成SQL语句执行。相比使用字符串拼接SQL,参数绑定方式更加安全稳定。

另外,使用NamedParameterJdbcTemplate可以更清晰地表达参数的意图,阅读SQL语句的人一眼就能看出哪些是参数。而多个?的方式不太直观。

所以,在 JdbcTemplate 中使用参数绑定来防止SQL注入并提高SQL语句的可读性,是非常推荐的方案。同时,可以根据需要选择使用?占位符或NamedParameterJdbcTemplate命名参数的方式。