
在 Java 开发中,数据库操作是非常常见的需求。传统的 JDBC(Java Database Connectivity)操作需要编写大量的样板代码,包括建立连接、创建语句、执行查询、处理结果集、关闭资源等,这不仅繁琐,还容易出错。Spring JDBC 提供了 JdbcTemplate 类,它封装了 JDBC 的常见操作,大大简化了数据库访问的代码。本文将详细介绍 JdbcTemplate 的使用方法,并通过实例演示其强大功能。
在开始使用 JdbcTemplate 之前,我们需要进行一些环境准备工作。
如果你使用 Maven 进行项目管理,需要在 pom.xml 中添加以下依赖:
<dependencies><!-- Spring JDBC --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- MySQL 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>
在 application.properties 中配置数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/testdbspring.datasource.username=rootspring.datasource.password=passwordspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
在 Spring 中,我们可以通过依赖注入的方式获取 JdbcTemplate 实例:
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Component;@Componentpublic class UserDao {private final JdbcTemplate jdbcTemplate;@Autowiredpublic UserDao(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 后续的数据库操作方法将在这里实现}
下面是一个插入用户信息的示例:
public void insertUser(String name, int age) {String sql = "INSERT INTO users (name, age) VALUES (?, ?)";jdbcTemplate.update(sql, name, age);}
在这个示例中,jdbcTemplate.update() 方法用于执行 SQL 插入、更新或删除操作。? 是占位符,对应后面的参数。
import org.springframework.jdbc.core.RowMapper;import java.sql.ResultSet;import java.sql.SQLException;public User getUserById(int id) {String sql = "SELECT * FROM users WHERE id = ?";return jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());}private static class UserRowMapper implements RowMapper<User> {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User user = new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setAge(rs.getInt("age"));return user;}}
在这个示例中,jdbcTemplate.queryForObject() 方法用于查询单个记录。RowMapper 接口用于将结果集的每一行映射到 Java 对象。
public List<User> getAllUsers() {String sql = "SELECT * FROM users";return jdbcTemplate.query(sql, new UserRowMapper());}
jdbcTemplate.query() 方法用于查询多个记录,返回一个包含多个 Java 对象的列表。
public void updateUser(int id, String name, int age) {String sql = "UPDATE users SET name = ?, age = ? WHERE id = ?";jdbcTemplate.update(sql, name, age, id);}
public void deleteUser(int id) {String sql = "DELETE FROM users WHERE id = ?";jdbcTemplate.update(sql, id);}
JdbcTemplate 支持批量插入、更新和删除操作,以提高性能:
public void batchInsertUsers(List<User> users) {String sql = "INSERT INTO users (name, age) VALUES (?, ?)";jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {@Overridepublic void setValues(java.sql.PreparedStatement ps, int i) throws SQLException {User user = users.get(i);ps.setString(1, user.getName());ps.setInt(2, user.getAge());}@Overridepublic int getBatchSize() {return users.size();}});}
JdbcTemplate 也可以调用存储过程:
import org.springframework.jdbc.core.CallableStatementCreator;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.SqlOutParameter;import org.springframework.jdbc.core.SqlParameter;import org.springframework.stereotype.Component;import java.sql.*;import java.util.HashMap;import java.util.Map;@Componentpublic class StoredProcedureExample {private final JdbcTemplate jdbcTemplate;public StoredProcedureExample(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public int callStoredProcedure(int input) {String procedureName = "{call test_procedure(?, ?)}";Map<String, Object> inParams = new HashMap<>();inParams.put("input_param", input);Map<String, Object> outParams = jdbcTemplate.call(new CallableStatementCreator() {@Overridepublic CallableStatement createCallableStatement(Connection con) throws SQLException {CallableStatement cs = con.prepareCall(procedureName);cs.setInt(1, input);cs.registerOutParameter(2, Types.INTEGER);return cs;}}, java.util.Arrays.asList(new SqlParameter("input_param", Types.INTEGER),new SqlOutParameter("output_param", Types.INTEGER)));return (int) outParams.get("output_param");}}
JdbcTemplate 是 Spring JDBC 提供的一个强大工具,它简化了 JDBC 操作,减少了样板代码,提高了开发效率。以下是 JdbcTemplate 常用方法的总结:
| 方法 | 用途 |
|---|---|
update() |
执行插入、更新或删除操作 |
queryForObject() |
查询单个记录 |
query() |
查询多个记录 |
batchUpdate() |
批量插入、更新或删除操作 |
call() |
调用存储过程 |
通过合理使用 JdbcTemplate,我们可以更加高效地进行数据库操作,同时保证代码的简洁性和可维护性。希望本文对你理解和使用 JdbcTemplate 有所帮助。
以上示例代码中的 User 类定义如下:
public class User {private int id;private String name;private int age;// Getters and Setterspublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
这样,我们就完成了对 JdbcTemplate 的详细介绍和实例演示。在实际开发中,你可以根据具体需求灵活运用这些方法。