【Spring Boot 应用开发】-04 自动配置-数据源

ops/2025/1/12 16:47:40/

深入讲解 Spring Boot 自动配置中的数据源配置

为了更好地理解 Spring Boot 中的自动配置机制,我们以数据源配置机制为例,按照以下顺序进行讲解:

  1. 不使用任何框架来连接数据源的方式
  2. 使用 Spring MVC 连接数据源的方式
  3. 使用 Spring Boot 自动配置连接数据源的方式

每个部分都会配有实例代码,并对代码进行详细的解释。

1. 不使用任何框架来连接数据源的方式

1.1 实例代码
java">import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DataSourceExample {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {// 1. 加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2. 创建数据库连接String url = "jdbc:mysql://localhost:3306/mydb";String user = "root";String password = "secret";connection = DriverManager.getConnection(url, user, password);// 3. 创建 PreparedStatement 对象String sql = "SELECT id, name, email FROM users WHERE id = ?";preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, 1); // 设置参数// 4. 执行查询resultSet = preparedStatement.executeQuery();// 5. 处理查询结果while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");String email = resultSet.getString("email");System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);}} catch (ClassNotFoundException e) {System.out.println("MySQL JDBC Driver not found.");e.printStackTrace();} catch (SQLException e) {System.out.println("Connection failed or query execution failed!");e.printStackTrace();} finally {// 6. 关闭资源try {if (resultSet != null) resultSet.close();if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}
1.2 代码解释
  1. 加载数据库驱动

    java">Class.forName("com.mysql.cj.jdbc.Driver");
    

    这行代码用于加载 MySQL 的 JDBC 驱动类。

  2. 创建数据库连接

    java">String url = "jdbc:mysql://localhost:3306/mydb";
    String user = "root";
    String password = "secret";
    connection = DriverManager.getConnection(url, user, password);
    

    这里我们定义了数据库的 URL、用户名和密码,然后使用 DriverManager.getConnection 方法创建数据库连接。

  3. 创建 PreparedStatement 对象

    java">String sql = "SELECT id, name, email FROM users WHERE id = ?";
    preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setInt(1, 1); // 设置参数
    

    使用 connection.prepareStatement(sql) 方法创建一个 PreparedStatement 对象,并设置 SQL 查询语句中的参数。

  4. 执行查询

    java">resultSet = preparedStatement.executeQuery();
    

    使用 preparedStatement.executeQuery() 方法执行查询,返回一个 ResultSet 对象。

  5. 处理查询结果

    java">while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");String email = resultSet.getString("email");System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
    }
    

    使用 resultSet.next() 方法遍历查询结果集,使用 resultSet.getIntresultSet.getString 方法获取每一行的数据。

  6. 关闭资源

    java">try {if (resultSet != null) resultSet.close();if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();
    } catch (SQLException e) {e.printStackTrace();
    }
    

    最后,确保关闭 ResultSetPreparedStatementConnection 对象,以释放资源。

2. 使用 Spring MVC 连接数据源的方式

2.1 实例代码

首先,我们需要在 pom.xml 中添加 Spring 和 JDBC 的依赖:

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.10</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.10</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency>
</dependencies>

然后,创建一个配置类来配置数据源:

java">import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;import javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("root");dataSource.setPassword("secret");return dataSource;}
}

接下来,创建一个简单的 DAO 类来使用数据源:

java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;@Repository
public class UserDao {private final JdbcTemplate jdbcTemplate;@Autowiredpublic UserDao(DataSource dataSource) {this.jdbcTemplate = new JdbcTemplate(dataSource);}public void createUser(String name, String email) {String sql = "INSERT INTO users (name, email) VALUES (?, ?)";jdbcTemplate.update(sql, name, email);}
}

最后,创建一个 Spring 应用上下文来测试数据源配置:

java">import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class SpringMVCExample {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(DataSourceConfig.class);UserDao userDao = context.getBean(UserDao.class);userDao.createUser("John Doe", "john.doe@example.com");System.out.println("User created successfully!");}
}
2.2 代码解释
  1. 配置数据源

    java">@Bean
    public DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("root");dataSource.setPassword("secret");return dataSource;
    }
    

    DataSourceConfig 类中,我们定义了一个 dataSource Bean,使用 DriverManagerDataSource 来配置数据库连接信息。

  2. 创建 DAO 类

    java">@Repository
    public class UserDao {private final JdbcTemplate jdbcTemplate;@Autowiredpublic UserDao(DataSource dataSource) {this.jdbcTemplate = new JdbcTemplate(dataSource);}public void createUser(String name, String email) {String sql = "INSERT INTO users (name, email) VALUES (?, ?)";jdbcTemplate.update(sql, name, email);}
    }
    

    UserDao 类使用 @Repository 注解标记为 Spring 的 DAO 组件。通过构造函数注入 DataSource,并使用 JdbcTemplate 执行 SQL 操作。

  3. 创建 Spring 应用上下文

    java">ApplicationContext context = new AnnotationConfigApplicationContext(DataSourceConfig.class);
    UserDao userDao = context.getBean(UserDao.class);
    userDao.createUser("John Doe", "john.doe@example.com");
    

    SpringMVCExample 类中,我们创建了一个 Spring 应用上下文,并获取 UserDao Bean 来执行数据库操作。

3. 使用 Spring Boot 自动配置连接数据源的方式

3.1 实例代码

首先,在 pom.xml 中添加 Spring Boot 和 JDBC 的依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
</dependencies>

然后,在 application.yaml 中配置数据源:

spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: secretdriver-class-name: com.mysql.cj.jdbc.Driver

接下来,创建一个简单的 DAO 类来使用数据源:

java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;@Repository
public class UserDao {private final JdbcTemplate jdbcTemplate;@Autowiredpublic UserDao(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public void createUser(String name, String email) {String sql = "INSERT INTO users (name, email) VALUES (?, ?)";jdbcTemplate.update(sql, name, email);}
}

最后,创建一个 Spring Boot 应用类来测试数据源配置:

java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootExample implements CommandLineRunner {@Autowiredprivate UserDao userDao;public static void main(String[] args) {SpringApplication.run(SpringBootExample.class, args);}@Overridepublic void run(String... args) throws Exception {userDao.createUser("John Doe", "john.doe@example.com");System.out.println("User created successfully!");}
}
3.2 代码解释
  1. 配置数据源

    spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: rootpassword: secretdriver-class-name: com.mysql.cj.jdbc.Driver
    

    application.yaml 文件中,我们配置了数据库的 URL、用户名、密码和驱动类名。Spring Boot 会自动读取这些配置并创建 DataSource

  2. 创建 DAO 类

    java">@Repository
    public class UserDao {private final JdbcTemplate jdbcTemplate;@Autowiredpublic UserDao(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public void createUser(String name, String email) {String sql = "INSERT INTO users (name, email) VALUES (?, ?)";jdbcTemplate.update(sql, name, email);}
    }
    

    UserDao 类与 Spring MVC 示例中的相同,使用 @Repository 注解标记为 Spring 的 DAO 组件,并通过构造函数注入 JdbcTemplate

  3. 创建 Spring Boot 应用类

    java">@SpringBootApplication
    public class SpringBootExample implements CommandLineRunner {@Autowiredprivate UserDao userDao;public static void main(String[] args) {SpringApplication.run(SpringBootExample.class, args);}@Overridepublic void run(String... args) throws Exception {userDao.createUser("John Doe", "john.doe@example.com");System.out.println("User created successfully!");}
    }
    

    SpringBootExample 类中,我们使用 @SpringBootApplication 注解来启用 Spring Boot 的自动配置。通过实现 CommandLineRunner 接口,我们可以在应用启动后执行一些初始化操作,例如调用 UserDao 的方法来创建用户。

4. 总结

通过以上三个部分的讲解,我们可以看到 Spring Boot 的自动配置机制是如何简化数据源配置的:

  1. 不使用任何框架:需要手动加载驱动、创建连接、执行 SQL 操作并关闭连接。
  2. 使用 Spring MVC:需要手动配置数据源 Bean,并通过依赖注入使用数据源。
  3. 使用 Spring Boot:只需在配置文件中配置数据库信息,Spring Boot 会自动创建 DataSourceJdbcTemplate,大大简化了配置过程。

整个架构的演变遵循着单一职责原则,将配置何代码分割开,提高内聚减少耦合,隐藏和业务无关的底层实现。这种思想我们可以在自己的编码工作中借鉴。


http://www.ppmy.cn/ops/149502.html

相关文章

OpenCoze 安全性及国产化替代剖析

OpenCoze 作为一款具有潜力的开源企业 ERP MES 系统&#xff0c;其在安全性设计以及国产化替代策略上有着独特的考量&#xff0c;以满足企业在复杂多变的数字化环境中的需求。 一、安全性设计 &#xff08;一&#xff09;用户认证与授权 动态令牌认证&#xff1a;OpenCoze …

详解用大模型超拟人语音做桌面AI宠物/机器人的个性化能力

前言 本文基于前面已经落地的CSK6大模型语音视觉开发板的配套示例功能来进行讲解&#xff0c;超拟人交互效果可以参考视频&#xff1a; 超拟人语音极速回复演示视频 目前聆思平台的超拟人模板实现了快速响应、声纹识别、知识库问答、兜底闲聊、超拟人TTS等功能&#xff0c;具体…

linux开发的一些问题

1.linux由于目前的开发环境问题,是在10.00.00.213上完成编译,在10.00.00.52上启动和调试xds,它们之间的文件互传可以使用xftp 2.在10.00.00.213编译的时候,首先需要设置环境变量,然后也需要及时更新对应的代码. 编辑10.00.00.213上的linux时,使用的时mobaXterm,启动时要设置自定…

为AI聊天工具添加一个知识系统 之26 资源存储库和资源管理器

本文要点 资源存储库 为了能完成本项目&#xff08;“为AI聊天工具增加一个知识系统”&#xff0c;其核心能力是“语言处理” &#xff0c;该能力的最大挑战 当仁不让的应该是自然语言处理&#xff09;的设计&#xff0c;我们考虑一个问题&#xff1a;在自然语言处理中&#…

《Spring Framework实战》13:4.1.4.4.延迟初始化Bean

欢迎观看《Spring Framework实战》视频教程 延迟初始化Bean 默认情况下&#xff0c;ApplicationContext实现在初始化过程中急切地创建和配置所有单例bean。通常&#xff0c;这种预实例化是可取的&#xff0c;因为配置或周围环境中的错误会立即被发现&#xff0c;而不是在几小时…

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决 文章目录 1.问题2.解决方法3.总结 1.问题 之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像&#xff0c;前几天我使用Docker Desktop环境重新构建了一个…

关于ReLU激活函数的解释以及其在神经网络中的应用

ReLU&#xff08;Rectified Linear Unit&#xff0c;修正线性单元&#xff09;是一种常用的激活函数&#xff0c;广泛应用于神经网络中&#xff0c;特别是深度学习中。它的定义非常简单且直观。ReLU的公式如下&#xff1a; f(x)max⁡(0,x)f(x) \max(0, x) 这意味着&#xff…

MySQL 子查询(重在练习)

第九章: 子查询 1.子查询的需求分析和问题解决 1.1基本使用 子查询(内查询)在主查询之前一次执行完成 子查询的结果被主查询(外查询)调用 注意事项 子查询要包含在括号内 将子查询放在比较条件的右侧 单行操作符对应单行子查询,多行操作符对应多行子查询 1.2子查询的分类…