JDBC模板技术
JdbcTemplate 是 Spring 框架提供的核心 JDBC 工具类,用于简化数据库操作。它封装了 JDBC 的繁琐流程(如连接管理、SQL 执行、结果集处理等),让开发者更专注于业务逻辑,而非模板代码。
一、核心作用
- 自动管理连接:无需手动创建 / 关闭
Connection、Statement、ResultSet,避免连接泄漏。 - 简化 SQL 执行:提供便捷方法执行增删改查、批量操作等。
- 统一异常处理:将 JDBC 的
SQLException转换为 Spring 统一的DataAccessException体系,便于异常处理。 - 防 SQL 注入:默认支持参数化查询(
?占位符),避免注入风险。
二、基本使用步骤
1. 依赖配置
-
引入依赖(Maven):
xml
<!-- Spring JDBC 核心依赖 --> <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.20</version> <!-- 版本根据实际情况选择 --> </dependency> <!-- 数据库驱动(以 MySQL 为例) --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version> </dependency> <!-- 连接池(如 Druid) --> <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version> </dependency> -
配置数据源和 JdbcTemplate(Spring XML 配置):
xml
<!-- 1. 配置数据源(Druid 连接池) --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="123456"/> </bean><!-- 2. 配置 JdbcTemplate,注入数据源 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/> </bean>
2. 注入 JdbcTemplate
在业务类(如 Service 或 Dao)中通过依赖注入获取 JdbcTemplate 实例:
@Service
public class UserService {// 注入 JdbcTemplate@Autowiredprivate JdbcTemplate jdbcTemplate;// 业务方法中使用 jdbcTemplate 操作数据库
}
三、常用方法及示例
1. 增删改操作(update())
用于执行 INSERT、UPDATE、DELETE,返回受影响的行数。
-
新增数据:
public int addUser(User user) {String sql = "INSERT INTO user (name, age) VALUES (?, ?)";// 参数:SQL 语句 + 占位符对应的参数列表return jdbcTemplate.update(sql, user.getName(), user.getAge()); } -
修改数据:
public int updateUserAge(Long id, int newAge) {String sql = "UPDATE user SET age = ? WHERE id = ?";return jdbcTemplate.update(sql, newAge, id); } -
删除数据:
public int deleteUser(Long id) {String sql = "DELETE FROM user WHERE id = ?";return jdbcTemplate.update(sql, id); }
2. 查询操作(query() 系列)
用于执行 SELECT,需通过 RowMapper 或 ResultSetExtractor 将结果集映射为 Java 对象。
-
查询单条记录(
queryForObject()):public User getUserById(Long id) {String sql = "SELECT id, name, age FROM user WHERE id = ?";// RowMapper:将 ResultSet 的一行映射为 User 对象return jdbcTemplate.queryForObject(sql, new RowMapper<User>() {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User user = new User();user.setId(rs.getLong("id"));user.setName(rs.getString("name"));user.setAge(rs.getInt("age"));return user;}}, id); // 最后一个参数是 SQL 占位符的值 } -
查询多条记录(
query()):public List<User> getAllUsers() {String sql = "SELECT id, name, age FROM user";return jdbcTemplate.query(sql, new RowMapper<User>() {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User user = new User();user.setId(rs.getLong("id"));user.setName(rs.getString("name"));user.setAge(rs.getInt("age"));return user;}}); } -
查询单个值(如数量、总和):
public int getUserCount() {String sql = "SELECT COUNT(*) FROM user";// 返回值类型为 Integer.classreturn jdbcTemplate.queryForObject(sql, Integer.class); }
