微信登录

Spring JDBC - JdbcTemplate - 简化 JDBC 操作

Spring JDBC - JdbcTemplate - 简化 JDBC 操作

引言

在 Java 开发中,数据库操作是非常常见的需求。传统的 JDBC(Java Database Connectivity)操作需要编写大量的样板代码,包括建立连接、创建语句、执行查询、处理结果集、关闭资源等,这不仅繁琐,还容易出错。Spring JDBC 提供了 JdbcTemplate 类,它封装了 JDBC 的常见操作,大大简化了数据库访问的代码。本文将详细介绍 JdbcTemplate 的使用方法,并通过实例演示其强大功能。

环境准备

在开始使用 JdbcTemplate 之前,我们需要进行一些环境准备工作。

添加依赖

如果你使用 Maven 进行项目管理,需要在 pom.xml 中添加以下依赖:

  1. <dependencies>
  2. <!-- Spring JDBC -->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-jdbc</artifactId>
  6. </dependency>
  7. <!-- MySQL 驱动 -->
  8. <dependency>
  9. <groupId>mysql</groupId>
  10. <artifactId>mysql-connector-java</artifactId>
  11. </dependency>
  12. </dependencies>

配置数据源

application.properties 中配置数据库连接信息:

  1. spring.datasource.url=jdbc:mysql://localhost:3306/testdb
  2. spring.datasource.username=root
  3. spring.datasource.password=password
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

JdbcTemplate 基本使用

注入 JdbcTemplate

在 Spring 中,我们可以通过依赖注入的方式获取 JdbcTemplate 实例:

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.jdbc.core.JdbcTemplate;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public class UserDao {
  6. private final JdbcTemplate jdbcTemplate;
  7. @Autowired
  8. public UserDao(JdbcTemplate jdbcTemplate) {
  9. this.jdbcTemplate = jdbcTemplate;
  10. }
  11. // 后续的数据库操作方法将在这里实现
  12. }

插入数据

下面是一个插入用户信息的示例:

  1. public void insertUser(String name, int age) {
  2. String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
  3. jdbcTemplate.update(sql, name, age);
  4. }

在这个示例中,jdbcTemplate.update() 方法用于执行 SQL 插入、更新或删除操作。? 是占位符,对应后面的参数。

查询数据

查询单个记录

  1. import org.springframework.jdbc.core.RowMapper;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. public User getUserById(int id) {
  5. String sql = "SELECT * FROM users WHERE id = ?";
  6. return jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());
  7. }
  8. private static class UserRowMapper implements RowMapper<User> {
  9. @Override
  10. public User mapRow(ResultSet rs, int rowNum) throws SQLException {
  11. User user = new User();
  12. user.setId(rs.getInt("id"));
  13. user.setName(rs.getString("name"));
  14. user.setAge(rs.getInt("age"));
  15. return user;
  16. }
  17. }

在这个示例中,jdbcTemplate.queryForObject() 方法用于查询单个记录。RowMapper 接口用于将结果集的每一行映射到 Java 对象。

查询多个记录

  1. public List<User> getAllUsers() {
  2. String sql = "SELECT * FROM users";
  3. return jdbcTemplate.query(sql, new UserRowMapper());
  4. }

jdbcTemplate.query() 方法用于查询多个记录,返回一个包含多个 Java 对象的列表。

更新数据

  1. public void updateUser(int id, String name, int age) {
  2. String sql = "UPDATE users SET name = ?, age = ? WHERE id = ?";
  3. jdbcTemplate.update(sql, name, age, id);
  4. }

删除数据

  1. public void deleteUser(int id) {
  2. String sql = "DELETE FROM users WHERE id = ?";
  3. jdbcTemplate.update(sql, id);
  4. }

JdbcTemplate 高级特性

批量操作

JdbcTemplate 支持批量插入、更新和删除操作,以提高性能:

  1. public void batchInsertUsers(List<User> users) {
  2. String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
  3. jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
  4. @Override
  5. public void setValues(java.sql.PreparedStatement ps, int i) throws SQLException {
  6. User user = users.get(i);
  7. ps.setString(1, user.getName());
  8. ps.setInt(2, user.getAge());
  9. }
  10. @Override
  11. public int getBatchSize() {
  12. return users.size();
  13. }
  14. });
  15. }

存储过程调用

JdbcTemplate 也可以调用存储过程:

  1. import org.springframework.jdbc.core.CallableStatementCreator;
  2. import org.springframework.jdbc.core.JdbcTemplate;
  3. import org.springframework.jdbc.core.SqlOutParameter;
  4. import org.springframework.jdbc.core.SqlParameter;
  5. import org.springframework.stereotype.Component;
  6. import java.sql.*;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. @Component
  10. public class StoredProcedureExample {
  11. private final JdbcTemplate jdbcTemplate;
  12. public StoredProcedureExample(JdbcTemplate jdbcTemplate) {
  13. this.jdbcTemplate = jdbcTemplate;
  14. }
  15. public int callStoredProcedure(int input) {
  16. String procedureName = "{call test_procedure(?, ?)}";
  17. Map<String, Object> inParams = new HashMap<>();
  18. inParams.put("input_param", input);
  19. Map<String, Object> outParams = jdbcTemplate.call(new CallableStatementCreator() {
  20. @Override
  21. public CallableStatement createCallableStatement(Connection con) throws SQLException {
  22. CallableStatement cs = con.prepareCall(procedureName);
  23. cs.setInt(1, input);
  24. cs.registerOutParameter(2, Types.INTEGER);
  25. return cs;
  26. }
  27. }, java.util.Arrays.asList(
  28. new SqlParameter("input_param", Types.INTEGER),
  29. new SqlOutParameter("output_param", Types.INTEGER)
  30. ));
  31. return (int) outParams.get("output_param");
  32. }
  33. }

总结

JdbcTemplate 是 Spring JDBC 提供的一个强大工具,它简化了 JDBC 操作,减少了样板代码,提高了开发效率。以下是 JdbcTemplate 常用方法的总结:

方法 用途
update() 执行插入、更新或删除操作
queryForObject() 查询单个记录
query() 查询多个记录
batchUpdate() 批量插入、更新或删除操作
call() 调用存储过程

通过合理使用 JdbcTemplate,我们可以更加高效地进行数据库操作,同时保证代码的简洁性和可维护性。希望本文对你理解和使用 JdbcTemplate 有所帮助。

以上示例代码中的 User 类定义如下:

  1. public class User {
  2. private int id;
  3. private String name;
  4. private int age;
  5. // Getters and Setters
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getAge() {
  19. return age;
  20. }
  21. public void setAge(int age) {
  22. this.age = age;
  23. }
  24. }

这样,我们就完成了对 JdbcTemplate 的详细介绍和实例演示。在实际开发中,你可以根据具体需求灵活运用这些方法。

Spring JDBC - JdbcTemplate - 简化 JDBC 操作