在 Spring Boot 项目中,使用 JdbcTemplate 是访问数据库的一种常见方式,它提供了一些简化的 API 来进行数据库的操作,比如执行 SQL 查询、插入、更新和删除等操作。Spring 的 JdbcTemplate 是一种非常方便的数据库访问工具,它封装了很多复杂的操作,让你可以更专注于业务逻辑的编写。

下面是对 Spring Boot 项目中使用 JdbcTemplate 访问数据库的源代码分析,重点讲解其配置、操作流程、常用方法、异常处理等方面。


📁 一、Spring Boot 项目中配置 JdbcTemplate

1. 引入依赖

首先,需要在 pom.xml 中引入 spring-boot-starter-jdbc 和数据库驱动(例如 MySQL 驱动)依赖:

<dependencies>
    <!-- Spring Boot JDBC Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

    <!-- MySQL Database Driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

spring-boot-starter-jdbc 提供了对 JdbcTemplate 和 DataSource 的自动配置,避免了手动配置很多内容。


2. 配置数据库连接

在 application.properties 或 application.yml 文件中配置数据库连接信息,例如:

# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jpa.hibernate.ddl-auto=update
spring.datasource.initialization-mode=always

这样配置后,Spring Boot 会自动创建一个 DataSource,并将其注入到 JdbcTemplate 中。


🔑 二、JdbcTemplate 的核心概念

Spring 提供的 JdbcTemplate 是一个用于执行数据库操作的类,它简化了 JDBC 编程模型,自动处理了很多复杂的工作,如连接管理、异常处理、资源释放等。

1. JdbcTemplate 配置

通常我们不需要手动创建 JdbcTemplate 实例,因为 Spring Boot 会自动配置并注入。如果需要自定义或手动注入,可以通过配置类来显式定义:

@Configuration
public class JdbcConfig {

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

这里通过 @Bean 注解定义了 JdbcTemplate,并通过构造函数注入了 DataSource,这就是数据库连接源。

2. 常用操作

JdbcTemplate 提供了许多常用的数据库操作方法。以下是一些典型的方法:

  • queryForObject:查询单个对象
  • query:查询多个对象
  • update:执行 DML 操作(如 INSERT、UPDATE、DELETE)
  • batchUpdate:批量执行更新操作
  • execute:执行原生 SQL 语句

🔄 三、操作流程和方法示例

1. 插入数据 – update

假设我们有一个用户表 users,结构如下:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

我们可以通过 JdbcTemplate 来执行插入操作。

📌 插入操作代码示例:

@Autowired
private JdbcTemplate jdbcTemplate;

public void addUser(String name, String email) {
    String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
    jdbcTemplate.update(sql, name, email);
}
  • update() 方法用于执行 INSERTUPDATE 或 DELETE 操作。它接受 SQL 语句、参数和可选的 PreparedStatementSetter
  • 这里 ? 是占位符,jdbcTemplate.update() 会将实际的 name 和 email 替换进去。

📚 知识要点:

  • JdbcTemplate.update() 方法可以执行 DML 操作(如插入、更新、删除)。
  • 可以直接将 SQL 语句作为参数传入,并通过参数绑定来防止 SQL 注入。

2. 查询数据 – queryForObject 和 query

📌 查询单个数据 – queryForObject

如果我们需要查询一个用户的详细信息,可以使用 queryForObject() 方法。

public User getUserById(int id) {
    String sql = "SELECT * FROM users WHERE id = ?";
    return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
}
  • queryForObject() 方法返回单个结果,如果查询不到结果,它会抛出异常。
  • BeanPropertyRowMapper 将查询结果映射为一个 Java 对象。通过类的字段名与 SQL 查询结果的列名匹配,自动填充属性。

📌 查询多个数据 – query

如果我们查询的是多条记录,可以使用 query() 方法:

public List<User> getAllUsers() {
    String sql = "SELECT * FROM users";
    return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
}
  • query() 方法适用于查询多条记录,它返回一个结果列表。

📚 知识要点:

  • queryForObject 用于查询单条数据,并且返回一个对象。
  • query 用于查询多条数据,返回一个对象列表。
  • 使用 RowMapper 将查询结果映射为 Java 对象。

3. 执行原生 SQL 语句 – execute

JdbcTemplate 还支持执行原生 SQL 语句,通常用于执行非查询操作,或者需要执行数据库特定功能时。

public void createTable() {
    String sql = "CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100))";
    jdbcTemplate.execute(sql);
}
  • execute() 方法可以执行任何 SQL 语句。

📚 知识要点:

  • execute() 方法用于执行不需要返回结果的 SQL 语句(如创建表、删除表等)。

⚠️ 四、异常处理

Spring 的 JdbcTemplate 会自动将 SQL 异常转换为 DataAccessException,这是一个运行时异常,它是 Spring 数据访问层的基础异常类。

例如,在查询时,若没有找到数据,queryForObject() 会抛出 EmptyResultDataAccessException,你可以在代码中捕获这个异常:

try {
    User user = getUserById(1);
} catch (EmptyResultDataAccessException e) {
    // 处理未找到数据的情况
}
  • Spring 会自动将 JDBC 异常转换为 DataAccessException,可以捕获并进行自定义处理。

📘 五、完整示例:Spring Boot 使用 JdbcTemplate 的 CRUD 操作

@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // 添加用户
    public void addUser(String name, String email) {
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
        jdbcTemplate.update(sql, name, email);
    }

    // 查询用户
    public User getUserById(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
    }

    // 查询所有用户
    public List<User> getAllUsers() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    // 删除用户
    public void deleteUser(int id) {
        String sql = "DELETE FROM users WHERE id = ?";
        jdbcTemplate.update(sql, id);
    }
}

🧩 六、总结

通过上面的源代码分析,我们了解了在 Spring Boot 项目中如何使用 JdbcTemplate 来访问数据库。JdbcTemplate 是一种简化 JDBC 编程的工具,它封装了连接管理、异常处理等繁琐的工作。通过其提供的 API(如 updatequeryexecute 等),可以轻松地进行数据库操作。

主要要点:

  • 使用 JdbcTemplate 可以简化 JDBC 的使用,减少样板代码。
  • JdbcTemplate 自动处理数据库连接、异常和资源释放。
  • RowMapper 是一个非常重要的工具,它将数据库结果集映射为 Java 对象。
  • DataAccessException 是 Spring 提供的异常基类,便于处理数据库操作中的异常。

如果你需要对某个特定方法或配置进行更深入的了解,或者有任何问题,欢迎随时提问!