JdbcTemplate支持使用命名参数的方式执行SQL语句,主要步骤如下:
- 定义SQL语句,使用:name的方式表示命名参数:
SELECT * FROM user WHERE age > :age AND name = :name
- 创建SqlParameterSource接口的实现,包含参数值:
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("age", 30);
params.addValue("name", "John");
- 使用update()或query()方法,传入SQL语句和SqlParameterSource:
jdbcTemplate.update(sql, params); // 更新
List<User> users = jdbcTemplate.query(sql, params, rowMapper); // 查询
- JdbcTemplate会自动替换SQL语句中的:name为对应的参数值。
示例:
String sql = "SELECT * FROM user WHERE age > :age AND name = :name";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("age", 30);
params.addValue("name", "John");
List<User> users = jdbcTemplate.query(sql, params, new BeanPropertyRowMapper<>(User.class));
相比?占位符方式,命名参数的优点为:
- SQL语句更易读,’:name’比’?’更能表示参数语义
- 无需关心参数顺序
但缺点是由于预编译语句只处理?,无法改变原SQL,会引入SQL注入风险。建议:
- 只在SELECT查询中使用命名参数
- 更新和删除操作仍使用标准占位符方式
JdbcTemplate通过支持标准占位符和命名参数两种方式,兼顾了易用性和安全性。对用户而言,可以根据语句类型选择不同的方式,这增加了灵活性。