在 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/testdb
spring.datasource.username=root
spring.datasource.password=password
spring.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;
@Component
public class UserDao {
private final JdbcTemplate jdbcTemplate;
@Autowired
public 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> {
@Override
public 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() {
@Override
public 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());
}
@Override
public 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;
@Component
public 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() {
@Override
public 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 Setters
public 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
的详细介绍和实例演示。在实际开发中,你可以根据具体需求灵活运用这些方法。