jdbcTemplate.query中使用全部字符串和参数注入,
查询速度为什么差距这么大
如何正确使用JdbcTemplate参数化查询
1、使用?占位符
String sql = "SELECT * FROM users WHERE name LIKE ?";
List<User> users = jdbcTemplate.query(
sql,
new Object[]{"%John%"}, // 参数值
(rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name"))
);
2、命名参数(NamedParameterJdbcTemplate)
NamedParameterJdbcTemplate namedTemplate = new NamedParameterJdbcTemplate(dataSource);
String sql = "SELECT * FROM users WHERE name LIKE :name";
Map<String, Object> params = new HashMap<>();
params.put("name", "%John%");
List<User> users = namedTemplate.query(sql, params, rowMapper);
为什么有时性能差距不明显?
小数据量:表数据少或查询次数少时,数据库能快速解析,差距不易察觉。
简单查询:极简单的SQL(如无JOIN/排序)解析成本低。
执行计划无法复用:即使参数化查询,若每次参数类型变化大(如从INT变VARCHAR),可能导致数据库重新生成执行计划。
最佳实践
永远使用参数化查询:避免SQL注入 + 提升性能。
避免在循环中执行查询:改用批量操作(batchUpdate)或IN查询。
统一参数类型:确保传入参数类型与数据库列类型一致,避免执行计划失效。
通过参数化查询,数据库引擎能更高效地工作,尤其在并发高、数据量大时,性能提升可能达到数倍甚至更高。