Spring中使用JdbcTemplate执行原生SQL查询需先配置并注入JdbcTemplate实例,再调用queryForObject()查单值、query()查多行(配RowMapper),参数化查询用?占位符防注入,结果映射可选BeanPropertyRowMapper或自定义RowMapper。

Spring 使用 JdbcTemplate 执行原生 SQL 查询非常直接,核心是注入已配置好的 JdbcTemplate 实例,调用其查询方法并传入 SQL 字符串和参数(如有)。
准备 JdbcTemplate 实例
确保 Spring 容器中已配置好 JdbcTemplate。通常通过 DataSource 自动装配:
@Configuration
public class JdbcConfig {
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}在 DAO 或 Service 类中直接注入使用:
@Repository
public class UserDao {
private final JdbcTemplate jdbcTemplate;
<pre class="brush:php;toolbar:false;">public UserDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}}
执行简单查询(无参数)
适合固定 SQL,如统计总数、查单个值等:
- 查单个结果(如 count、max、字符串)用
queryForObject() - 返回多行结果用
query(),需提供RowMapper映射每行数据
// 查询用户总数
int count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM users", Integer.class);
<p>// 查询所有用户名
List<String> names = jdbcTemplate.query(
"SELECT name FROM users WHERE status = 'ACTIVE'",
(rs, rowNum) -> rs.getString("name")
);执行带参数的查询(防 SQL 注入)
永远优先使用占位符 ? + 参数数组/列表,避免拼接字符串:
- 参数顺序必须与
?出现顺序一致 - 支持基本类型、String、Date、BigDecimal 等常见类型
- 复杂对象需自定义
RowMapper或用BeanPropertyRowMapper
// 根据 ID 查用户
User user = jdbcTemplate.queryForObject(
"SELECT id, name, email FROM users WHERE id = ?",
new BeanPropertyRowMapper<>(User.class),
123L
);
<p>// 多参数查询
List<User> users = jdbcTemplate.query(
"SELECT * FROM users WHERE status = ? AND created_date > ?",
new BeanPropertyRowMapper<>(User.class),
"ACTIVE",
LocalDate.of(2024, 1, 1)
);处理结果集映射(自定义 vs 内置)
推荐根据场景选择映射方式:
- 查单个字段或简单结构 → 匿名
RowMapper或直接用queryForObject(Class) - 查完整实体类 →
BeanPropertyRowMapper(要求列名与属性名匹配,或加@Column注解) - 需要复杂转换(如枚举、嵌套对象、空值处理)→ 自定义
RowMapper实现
// 自定义映射:处理 status 字段转为枚举
jdbcTemplate.query(
"SELECT id, name, status FROM users",
(rs, rowNum) -> new User(
rs.getLong("id"),
rs.getString("name"),
Status.valueOf(rs.getString("status"))
)
);
















