JdbcTemplate
是 Spring 框架中用于简化 JDBC 操作的核心工具类,它封装了底层 JDBC 的繁琐操作(如连接管理、异常处理等),使开发者能更专注于 SQL 和业务逻辑。以下是其核心方法及用途:
1. 更新操作(DML:INSERT/UPDATE/DELETE)
int update(String sql, Object... args)
- 用途:执行
增删改
操作,返回受影响的行数。 - 参数:
sql
:SQL 语句,使用?
作为占位符。args
:填充占位符的参数列表。
- 示例1、数据插入:
或String sql = "INSERT INTO user(name, age) VALUES(?, ?)"; int rows = jdbcTemplate.update(sql, "Alice", 25);
String sql = "INSERT INTO user(name, age) VALUES(?, ?)"; int rows = jdbcTemplate.update(sql, new Object[]{ "Alice", 25 });
- 示例2、数据更新:
String sql = "UPDATE user SET age=? WHERE name=?"; int rows = jdbcTemplate.update(sql,25, "Alice" );
- 示例3、数据删除:
String sql = "DELETE user WHERE name=?"; int rows = jdbcTemplate.update(sql, "Alice" );
2. 查询操作(DQL:SELECT)
List<T> query(String sql, RowMapper<T> rowMapper, Object... args)
- 用途:查询多行数据,通过
RowMapper
将结果集映射为对象列表。 - 参数:
sql
:SQL 语句。rowMapper
:将每一行数据映射为一个对象(如实现RowMapper<T>
接口)。args
:SQL 参数。
- 示例:
String sql = "SELECT * FROM user WHERE age > ?"; List<User> users = jdbcTemplate.query(sql, (rs, rowNum) -> new User(rs.getString("name"), rs.getInt("age")), 18);
T queryForObject(String sql, RowMapper<T> rowMapper, Object... args)
- 用途:查询单条记录,若无结果或结果多条会抛出异常。
- 示例:
当User类中属性名为user表中字段的驼峰命名形式时,还可以按下面方式:User user = jdbcTemplate.queryForObject( "SELECT * FROM user WHERE id = ?", (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name")), 1 );
String sql="SELECT * FROM user WHERE id = ?"; int id=2; User user = jdbcTemplate.queryForObject( sql,new Object[]{id}, new BeanPropertyRowMapper<User >(User .class) );
List<Map<String, Object>> queryForList(String sql, Object... args)
- 用途:查询结果直接返回为
List<Map>
,适用于动态列或不确定表结构的情况。 - 示例:
List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT * FROM user");
3. 批处理操作
int[] batchUpdate(String sql, List<Object[]> batchArgs)
- 用途:批量执行相同 SQL(不同参数),提升效率。
- 参数:
sql
:SQL 语句。batchArgs
:每行参数是一个Object[]
,对应一次更新。
- 示例:
String sql = "INSERT INTO user(name, age) VALUES(?, ?)"; List<Object[]> batchArgs = Arrays.asList( new Object[]{"Alice", 25}, new Object[]{"Bob", 30} ); int[] rows = jdbcTemplate.batchUpdate(sql, batchArgs);
4. 执行任意 SQL(如 DDL)
int execute(String sql, Object... args)
- 用途:执行非查询类 SQL(如
CREATE TABLE
),返回受影响行数(可能为 0)。 - 示例:
String sql = "CREATE TABLE IF NOT EXISTS user (id INT PRIMARY KEY, name VARCHAR(50))"; jdbcTemplate.execute(sql);
5. 调用存储过程
void call(String sql, CallableStatementCreator csc, CallableStatementCallback<T> action)
- 用途:执行存储过程,支持输入/输出参数。
- 示例:
String sql = "{call get_user_by_id(?, ?)}"; jdbcTemplate.call(connection -> { CallableStatement cs = connection.prepareCall(sql); cs.setInt(1, 1); // 输入参数 cs.registerOutParameter(2, Types.VARCHAR); // 输出参数 return cs; }, (cs, rowNum) -> { String name = cs.getString(2); // 获取输出参数 System.out.println("User name: " + name); });
6. 其他实用方法
queryForMap
:查询单条记录并转为Map<String, Object>
。queryForRowSet
:返回SqlRowSet
(类似ResultSet
,但与连接解耦)。
关键特性
- 异常处理:自动将
SQLException
转换为 Spring 的DataAccessException
(运行时异常,无需显式捕获)。 - 参数绑定:支持
?
占位符和命名参数(需配合NamedParameterJdbcTemplate
)。 - 资源管理:自动关闭
Connection
、Statement
、ResultSet
,避免资源泄漏。
使用建议
- 优先使用
JdbcTemplate
而非原生 JDBC,减少模板代码。 - 结合
RowMapper
或BeanPropertyRowMapper
简化对象映射。 - 批处理操作时使用
batchUpdate
提升性能。
如果需要更简洁的命名参数支持,可考虑 NamedParameterJdbcTemplate
(基于 JdbcTemplate
扩展)。