在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定.
在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter).
那么什么是具名参数?
具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定。
具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代。
具名参数在处理in()参数时更加方便和安全。
具名参数只在 NamedParameterJdbcTemplate 中得到支持。
NamedParameterJdbcTemplate可以使用全部jdbcTemplate方法,除此之外,我们来看看使用它的具名参数案例:
public List<Employee> queryByFundid(int fundId) {
String sql = "select * from employee where id in (:ids) and dept = :dept";
Map<String, Object> args = new HashMap<>();
args.put("dept", "Tech");
List<Integer> ids = new ArrayList<>();
ids.add(3);
ids.add(32);
args.put("ids", ids);
NamedParameterJdbcTemplate givenParamJdbcTemp = new NamedParameterJdbcTemplate(jdbcTemplate);
List<Employee> data = givenParamJdbcTemp.queryForList(sql, args, Employee.class);
return data;
}
建议使用如下方式注入 NamedParameterJdbcTemplate
// @Autowired
// private JdbcTemplate jdbcTemplate;
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
这样注入后,如果想使用原生JdbcTemplate可以使用namedParameterJdbcTemplate.getJdbcTemplate()
public int queryPageTotal(String sql, List<Object> queryParams) {
sql = "select count(1) FROM (" + sql + ")T";
int total = this.namedParameterJdbcTemplate.getJdbcTemplate().queryForObject(sql, queryParams.toArray(), Integer.class);
return total;
}
使用具名参数
public List<Employee> queryByFundid(int fundId) {
String sql = "select * from employee where id in (:ids) and dept = :dept";
Map<String, Object> args = new HashMap<>();
args.put("dept", "Tech");
List<Integer> ids = new ArrayList<>();
ids.add(3);
ids.add(32);
args.put("ids", ids);
List<Employee> data = namedParameterJdbcTemplate.queryForList(sql, args, Employee.class);
return data;
}
参考: