Spring Boot(16)——使用DataSource

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 使用DataSource需要使用DataSource可以在pom.xml中添加spring-boot-starter-jdbc依赖,这会自动加入Spring Jdbc的依赖。还需要加入相应的JDBC驱动包的依赖,笔者这里使用的是MySQL的驱动。

使用DataSource

需要使用DataSource可以在pom.xml中添加spring-boot-starter-jdbc依赖,这会自动加入Spring Jdbc的依赖。还需要加入相应的JDBC驱动包的依赖,笔者这里使用的是MySQL的驱动。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

DataSource的自动配置由org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration负责,当不存在DataSource类型的bean时,其会负责创建一个池化的DataSource。内置支持的连接池包括下面这几个,默认自动使用的顺序也是按照下面的顺序进行使用。即如果Classpath下存在HikariDataSource时将优先使用HikariDataSource,其次是Tomcat提供的数据库连接池,最后是dbcp2。

  • com.zaxxer.hikari.HikariDataSource
  • org.apache.tomcat.jdbc.pool.DataSource
  • org.apache.commons.dbcp2.BasicDataSource

当添加了spring-boot-starter-jdbc依赖时,会自动级联加入Hikari依赖,即此时默认将使用HikariDataSource。当Classpath下同时存在多个支持的数据库连接池实现时,如果不期望使用自动选择的数据库连接池实现,可以通过spring.datasource.type指定需要使用的数据库连接池实现。比如如果Classpath下同时存在com.zaxxer.hikari.HikariDataSourceorg.apache.tomcat.jdbc.pool.DataSource,默认将使用com.zaxxer.hikari.HikariDataSource,如果期望使用org.apache.tomcat.jdbc.pool.DataSource,则可以配置spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

然后可以通过spring.datasource前缀开始的属性配置数据库连接相关的信息了,比如配置URL、驱动Class、用户名、密码等。数据库的配置信息由org.springframework.boot.autoconfigure.jdbc.DataSourceProperties负责接收。

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=elim

更多的配置信息可以参考DataSourceProperties的API文档。

如果需要对使用的HikariDataSource连接池进行配置,可以通过spring.datasource.hikari前缀开始的属性进行配置,对应的配置属性将由com.zaxxer.hikari.HikariDataSource负责接收,可以配置的属性请参考对应的API文档。

如果需要对使用的Tomcat连接池进行配置,可以通过spring.datasource.tomcat前缀开始的属性进行配置,对应的配置属性将由org.apache.tomcat.jdbc.pool.DataSource负责接收,可以配置的属性请参考对应的API文档。

如果需要对使用的dbcp2连接池进行配置,可以通过spring.datasource.dbcp2前缀开始的属性进行配置,对应的配置属性将由org.apache.commons.dbcp2.BasicDataSource负责接收,可以配置的属性请参考对应的API文档。

有了DataSource后,就可以使用DataSource了,我们可以在需要应用它的地方直接进行注入,比如下面这样。

@Service
public class JdbcService {

    @Autowired
    private DataSource dataSource;
    
    public List<String> getUsers() throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        List<String> names = new ArrayList<>();
        try {
            connection = this.dataSource.getConnection();
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select name from tb_user");
            while (resultSet.next()) {
                names.add(resultSet.getString(1));
            }
        } finally {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        }
        return names;
    }
    
}

现在的应用中基本都不会直接使用DataSource编程了,基本都是基于Hibernate、JPA或Mybatis编程。也有的会使用JdbcTemplate了。拥有了DataSource类型的bean后,Spring Boot的org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration将自动为我们配置JdbcTemplate bean,所以上述代码可以改写为如下这样。

@Service
public class JdbcService {

    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public List<String> getUsers() throws Exception {
        String sql = "select name from tb_user";
        List<String> names = this.jdbcTemplate.queryForList(sql, String.class);
        return names;
    }
    
}

可以使用spring.jdbc.template前缀开始的属性对JdbcTemplate进行一些自定义配置,对应的配置属性将由org.springframework.boot.autoconfigure.jdbc.JdbcProperties.Template负责接收,可以配置的属性请参考对应的API文档。

使用基于内嵌数据库的DataSource

Spring Boot支持对H2、HSQL和Derby三种内嵌的数据库进行自动配置,只要Classpath下存在它们相关的驱动Class,Spring Boot将自动配置对应的DataSource。基于内嵌数据库的自动配置的DataSource是不需要配置用户名、密码等数据库连接信息的。有了DataSource后就可以进行与DataSource相关的操作了,进行单元测试时使用内嵌的数据库是一个不错的选择。

使用基于JNDI的DataSource

如果需要使用基于JNDI的DataSource,则可以通过spring.datasource.jndi-name属性指定DataSource对应的JNDI名称。

spring.datasource.jndi-name=java:jboss/datasources/customers

(注:本文基于Spring Boot 2.0.3所写)

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
28天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
41 0
|
7天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
24 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
9天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
【Spring系列】Sping VS Sping Boot区别与联系
|
1月前
|
Java 数据库
【问题记录(已解决)】springboot整合ssm报错‘url‘ attribute is not specified and no embedded datasource
【问题记录(已解决)】springboot整合ssm报错‘url‘ attribute is not specified and no embedded datasource
|
2月前
|
XML 监控 druid
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
【Java专题_02】springboot+mybatis+pagehelper分页插件+druid数据源详细教程
|
3月前
|
Java
springboot项目打包瘦身
springboot项目打包瘦身
|
5月前
|
Java 测试技术
Springboot集成JUnit5优雅进行单元测试
Springboot集成JUnit5优雅进行单元测试
|
8月前
|
druid Java
SpringBoot整合Druid报错记录:Failed to configure a DataSource: ‘url‘ attribute is not specified and no embe
SpringBoot整合Druid报错记录:Failed to configure a DataSource: ‘url‘ attribute is not specified and no embe
|
安全 Java Maven
Spring Boot资源文件问题总结(Spring Boot的静态资源访问,配置文件外置)
Spring Boot资源文件问题总结(Spring Boot的静态资源访问,配置文件外置)
1305 1
|
9月前
|
Java Maven
【Springboot】创建boot工程spring-boot-maven-plugin报红、出错_解决方案
【Springboot】创建boot工程spring-boot-maven-plugin报红、出错_解决方案
317 0