在 Spring Boot 应用中,配置数据库连接是基础且重要的步骤。Spring Boot 提供了多种方式来处理数据库连接,其中一种常见方法是结合使用 @ConfigurationProperties
和 @Bean
来外部化配置并手动创建 DataSource
和 JdbcTemplate
实例。
本文将指导你通过创建两个 Java 类 DatabaseProperties
和 DataSourceConfig
来实现这一配置,并介绍如何在 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 依赖。- 我们定义了数据库连接所需的四个基本属性:
url
、username
、password
和driverClassName
。这些字段名需要与配置文件中去掉前缀后的属性名(例如spring.datasource.url
对应url
)对应。
2. 配置数据源和 JdbcTemplate (DataSourceConfig.java
)
接下来,创建一个配置类 DataSourceConfig.java
。这个类将负责读取 DatabaseProperties
中注入的属性,并使用这些属性手动创建并注册 DataSource
和 JdbcTemplate
这两个 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 注册到应用上下文中,通常有两种方式:
- 将
DatabaseProperties
类本身标注为 Spring 组件,例如@Component
、@Configuration
等。Spring Boot 的组件扫描会自动发现并注册它们。 - 在任何一个
@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.properties
或 application.yml
)
最后,在你的 Spring Boot 项目的 src/main/resources
https://www.google.com/search?q=%E7%9B%AE%E5%BD%95下的 application.properties
或 application.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.xml
或 build.gradle
中添加相应的数据库驱动依赖(例如 SQL Server 的 mssql-jdbc
)。
总结
通过以上步骤,我们成功地在 Spring Boot 项目中配置了数据库连接。我们使用 @ConfigurationProperties
将连接信息从代码中剥离到配置文件,提高了可维护性;然后使用 @Configuration
和 @Bean
手动创建并配置了 DataSource
和 JdbcTemplate
Bean,使我们能够灵活地控制 Bean 的创建过程;最后,在主应用类上使用 @EnableConfigurationProperties
确保了属性绑定的生效。
请记住,在生产环境中应替换 DriverManagerDataSource
为一个带有连接池的实现,以获得更好的性能和资源管理。Spring Boot 的自动配置是处理这种情况的更常见且推荐的方式,通常只需要添加依赖和配置标准属性即可。本文提供的手动配置方式适用于需要更细粒度控制的场景。
现在,你可以在你的服务或 DAO 类中通过 @Autowired
注入 JdbcTemplate
Bean,开始执行数据库操作了!