在Spring Boot中配置数据库连接

在 Spring Boot 应用中,配置数据库连接是基础且重要的步骤。Spring Boot 提供了多种方式来处理数据库连接,其中一种常见方法是结合使用 @ConfigurationProperties@Bean 来外部化配置并手动创建 DataSourceJdbcTemplate 实例。

本文将指导你通过创建两个 Java 类 DatabasePropertiesDataSourceConfig 来实现这一配置,并介绍如何在 application.properties (或 application.yml) 文件中指定连接信息。

1. 定义数据库连接属性 (DatabaseProperties.java)

首先,我们需要一个类来封装数据库连接所需的所有属性。通过使用 Spring Boot 的 @ConfigurationProperties 注解,我们可以轻松地将外部配置文件中的属性绑定到这个 Java 对象上。

创建一个名为 DatabaseProperties.java 的类:

package top.mryan2005.xxx; // 请根据你的实际包结构调整

import org.springframework.boot.context.properties.ConfigurationProperties;
import lombok.Data; // 如果使用 Lombok,需要添加此依赖

/**
 * 数据库连接配置属性
 */
@ConfigurationProperties(prefix = "spring.datasource") // 指定属性前缀
@Data // 使用 Lombok 简化 Getter/Setter, toString, equals, hashCode 等方法
public class DatabaseProperties {

    /**
     * 数据库连接 URL
     */
    private String url;

    /**
     * 数据库用户名
     */
    private String username;

    /**
     * 数据库密码
     */
    private String password;

    /**
     * 数据库驱动类名
     */
    private String driverClassName;

    // 注意:这里通常不需要显式定义 Getter/Setter,Lombok 的 @Data 会自动生成。
    // 如果不使用 Lombok,你需要手动添加 Getter 和 Setter 方法。
}

在这个类中:

  • @ConfigurationProperties(prefix = "spring.datasource") 注解告诉 Spring Boot 将所有以 spring.datasource 开头的属性绑定到这个类的字段上。
  • @Data 是 Lombok 提供的注解,可以自动生成所有字段的 getter、setter 方法,以及 toString()equals()hashCode() 方法,大大简化代码。你需要确保项目中已引入 Lombok 依赖。
  • 我们定义了数据库连接所需的四个基本属性:urlusernamepassworddriverClassName。这些字段名需要与配置文件中去掉前缀后的属性名(例如 spring.datasource.url 对应 url)对应。

2. 配置数据源和 JdbcTemplate (DataSourceConfig.java)

接下来,创建一个配置类 DataSourceConfig.java。这个类将负责读取 DatabaseProperties 中注入的属性,并使用这些属性手动创建并注册 DataSourceJdbcTemplate 这两个 Spring Bean。

创建一个名为 DataSourceConfig.java 的类:

package top.mryan2005.xxx; // 请根据你的实际包结构调整

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource; // 注意:DriverManagerDataSource 不提供连接池功能,不建议在生产环境使用

import javax.sql.DataSource;

/**
 * 数据库数据源和 JdbcTemplate 配置类
 */
@Configuration // 标注这是一个 Spring 配置类
public class DataSourceConfig {

    @Autowired // 自动注入 DatabaseProperties 实例
    private DatabaseProperties databaseProperties;

    /**
     * 配置并创建 DataSource Bean
     * 注意:DriverManagerDataSource 不提供连接池功能,生产环境建议使用连接池实现,如 HikariCP (Spring Boot 默认)、Druid 或 Tomcat JDBC Pool。
     * Spring Boot 在使用标准属性 (spring.datasource.*) 且引入对应依赖时通常会自动配置连接池 DataSource。
     * 手动创建 DataSource 的场景通常是为了更精细的控制或使用非标准配置。
     *
     * @return 配置好的 DataSource 实例
     */
    @Bean // 将方法返回的对象注册为 Spring Bean
    public DataSource dataSource() {
        // 这里的 System.out.println 仅为演示属性是否注入,实际应用中应移除
        // System.out.println("Database URL: " + databaseProperties.getUrl());
        // System.out.println("Database Username: " + databaseProperties.getUsername());
        // System.out.println("Database Password: " + databaseProperties.getPassword());
        // System.out.println("Database Driver: " + databaseProperties.getDriverClassName());

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(databaseProperties.getDriverClassName());
        dataSource.setUrl(databaseProperties.getUrl());
        dataSource.setUsername(databaseProperties.getUsername());
        dataSource.setPassword(databaseProperties.getPassword());

        return dataSource;
    }

    /**
     * 配置并创建 JdbcTemplate Bean
     * JdbcTemplate 是 Spring 提供的一个方便进行数据库操作的工具类。
     *
     * @param dataSource 自动注入的 DataSource Bean
     * @return 配置好的 JdbcTemplate 实例
     */
    @Bean // 将方法返回的对象注册为 Spring Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

在这个类中:

  • @Configuration 标注此类为配置类,Spring 会扫描其中的 @Bean 方法。
  • @Autowired 注入了我们之前定义的 DatabaseProperties 实例,Spring 会自动从环境中找到并提供这个 Bean(前提是 DatabaseProperties 被正确地注册为 Bean,下一节将说明)。
  • @Bean 标注的方法 (dataSource()jdbcTemplate()) 会被 Spring 调用,其返回值会被注册为 Spring 容器中的 Bean,Bean 的名称默认为方法名。
  • dataSource() 方法根据 databaseProperties 中的属性配置了一个 DriverManagerDataSource请注意DriverManagerDataSource 是最简单的 DataSource 实现,它每次获取连接都会新建一个,不包含连接池功能。在生产环境中,强烈建议使用带有连接池的 DataSource 实现,如 HikariCP (Spring Boot 默认集成并推荐)、Druid、Tomcat JDBC Pool 等。Spring Boot 在检测到相应的连接池依赖和标准配置属性时通常会自动配置连接池 DataSource。本例手动配置 DriverManagerDataSource 仅用于演示 @ConfigurationProperties 的使用。
  • jdbcTemplate() 方法接受一个 DataSource 参数(Spring 会自动注入容器中的 DataSource Bean),并创建一个 JdbcTemplate 实例。

3. 启用 Configuration Properties 绑定

为了让 Spring Boot 识别并处理 @ConfigurationProperties 标注的 DatabaseProperties 类,并将其作为 Bean 注册到应用上下文中,通常有两种方式:

  1. DatabaseProperties 类本身标注为 Spring 组件,例如 @Component@Configuration 等。Spring Boot 的组件扫描会自动发现并注册它们。
  2. 在任何一个 @Configuration 类或主应用类上使用 @EnableConfigurationProperties 注解,显式指定要启用的属性类。

由于我们在示例中没有给 DatabaseProperties 添加 @Component@Configuration 注解,因此需要使用第二种方式,在 Spring Boot 的主入口类 (*Application.java) 上添加 @EnableConfigurationProperties

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
// 其他 import 语句...

// 导入我们定义的 DatabaseProperties 类
import top.mryan2005.xxx.DatabaseProperties; // 请根据实际包结构调整

@SpringBootApplication
// 启用 DatabaseProperties 类,使其属性能够被绑定并注册为 Bean
@EnableConfigurationProperties(DatabaseProperties.class)
public class YourApplication { // 将 YourApplication 替换为你的主应用类名

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

通过 @EnableConfigurationProperties(DatabaseProperties.class) 注解,Spring Boot 会知道需要处理 DatabaseProperties 类上的 @ConfigurationProperties 注解,并将从配置文件中绑定的属性值注入到 DatabaseProperties 的实例中,然后将这个实例注册为一个 Bean。

4. 配置数据库连接属性 (application.propertiesapplication.yml)

最后,在你的 Spring Boot 项目的 src/main/resources https://www.google.com/search?q=%E7%9B%AE%E5%BD%95下的 application.propertiesapplication.yml 文件中添加数据库连接的具体配置。

使用 application.properties 文件:

# Database Configuration
spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=newSQLRepo;encrypt=false
spring.datasource.username=sa
spring.datasource.password=123456
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

# 注意:如果您手动创建 DataSource,并且使用的是 DriverManagerDataSource (不推荐用于生产),
# 上面的属性已足够。如果您希望 Spring Boot 自动配置连接池 (例如 Druid),并且您仍然
# 选择手动配置部分 DataSource 属性或使用非标准的 data-source-class-name,请确保
# 配置项与您实际使用的 DataSource 类型及其属性匹配。
# 例如,若使用 Druid 并希望 Spring Boot 自动配置,通常只需添加 Druid 依赖并配置标准
# 的 spring.datasource.* 属性,Spring Boot 会自动创建 DruidDataSource。
# 原文中出现的 spring.datasource.data-source-class-name 属性通常用于指定 Spring Boot
# 自动配置时使用的 DataSource 实现类,与本例中手动创建 DriverManagerDataSource 的方式冲突。
# 如果您手动创建 DataSource Bean,则此属性不会被您的代码直接使用。

或者使用 application.yml 文件(推荐,层级结构更清晰):

# Database Configuration
spring:
  datasource:
    url: jdbc:sqlserver://localhost:1433;databaseName=newSQLRepo;encrypt=false
    username: sa
    password: 123456
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    # 注意:同 application.properties 中的说明,此处配置项取决于你实际使用的 DataSource 类型
    # 和配置方式。手动创建 DriverManagerDataSource 时,只需上面的属性。

确保这些属性值与你的数据库实际连接信息一致。spring.datasource.driver-class-name 应该填写你所使用数据库对应的 JDBC 驱动类名,并且你需要在项目的 pom.xmlbuild.gradle 中添加相应的数据库驱动依赖(例如 SQL Server 的 mssql-jdbc)。

总结

通过以上步骤,我们成功地在 Spring Boot 项目中配置了数据库连接。我们使用 @ConfigurationProperties 将连接信息从代码中剥离到配置文件,提高了可维护性;然后使用 @Configuration@Bean 手动创建并配置了 DataSourceJdbcTemplate Bean,使我们能够灵活地控制 Bean 的创建过程;最后,在主应用类上使用 @EnableConfigurationProperties 确保了属性绑定的生效。

请记住,在生产环境中应替换 DriverManagerDataSource 为一个带有连接池的实现,以获得更好的性能和资源管理。Spring Boot 的自动配置是处理这种情况的更常见且推荐的方式,通常只需要添加依赖和配置标准属性即可。本文提供的手动配置方式适用于需要更细粒度控制的场景。

现在,你可以在你的服务或 DAO 类中通过 @Autowired 注入 JdbcTemplate Bean,开始执行数据库操作了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mryan2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值