JdbcTemplate支持使用PreparedStatement的参数绑定,主要有两种方式:
- 使用
?
作为参数占位符,在执行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"))
);
- ?作为参数占位符,查询时传入
John
和30
作为参数值绑定。
- 使用
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
命名参数的方式。