SpringBoot配置数据源DataSource

SpringBoot配置数据源DataSource

github源码地址:

https://github.com/yangxiaowan/databaseconfig.git

SpringBoot如何快速配置数据源?有如下两种方式:

通过spring-boot-starter-jdbc快速配置数据源 自定义数据源DataSource

首先我们需要明确数据源DataSource有什么作用:

通过DataSource可以获取数据库连接Connection

通过DataSource创建JdbcTemplate操作数据库

实际项目中,我们在配置数据源的时候会指定数据库连接池,比如流行的Hikari(spring默认的数据库连接池)、C3p0、Dbcp2以及阿里巴巴的Druid。应用在操作数据库的时候,直接从数据库连接池获取连接,而不需要每次创建新的连接。至于数据库连接池的好处,总结就是: 应用创建和销毁连接的代价是很大的,使用数据库连接池可以很好的复用连接,节省开销,方便管理,简化开发。

通过spring-boot-starter-jdbc快速配置数据源

1. 引入maven依赖。

org.springframework.boot

spring-boot-starter-jdbc

2.2.2.RELEASE

mysql

mysql-connector-java

8.0.18

2.在application.properties文件中配置数据库连接属性。

spring.datasource.url=jdbc:mysql://localhost:3306/blue?serverTimezone=UTC

spring.datasource.username=root

spring.datasource.password=wan4380797

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

(PS: 关于数据库驱动版本的小知识,当connector版本是6.0以前的使用com.mysql.jdbc.Driver,6.0以后的使用com.mysql.cj.jdbc.Driver,我这边使用的是8.0.18版本的)

上面2步我们就已经通过springboot starter机制为我们配置好数据源了。原理很简单。首先我们需要了解springboot的starter机制,通常情况下一个starter依赖是由多个依赖组成的。比如spring-boot-starter-jdbc由spring-boot-starter(自动配置,自动扫描)、spring-jdbc(提供spring管理数据库的标准接口)和HikariCP(Spring默认的数据库连接池)组成。所以springboot的starter依赖可以通过最少量的属性实现自动配置,至于深层次的原因还需要取看源码才行。

我们通过Junit来测试下我们的数据源DataSource是否配置成功:

@SpringBootTest

@RunWith(SpringRunner.class)

public class JdbcSimpleDatasourceApplicationTests {

@Autowired

private DataSource dataSource;

@Test

public void springDataSourceTest(){

//输出为true

System.out.println(dataSource instanceof HikariDataSource);

System.out.println(dataSource instanceof MyDataSource);

try{

Connection connection = dataSource.getConnection();

Statement statement = connection.createStatement();

ResultSet resultSet = statement.executeQuery("select * from student");

Student student = null;

if(resultSet.next()){

student = new Student();

student.setId(resultSet.getString("id"));

student.setStudentId(resultSet.getString("student_id"));

student.setStudentName(resultSet.getString("student_name"));

student.setAge(resultSet.getInt("age"));

}

System.out.println(student);

statement.close();

connection.close();

}catch (Exception exception){

exception.printStackTrace();

}

}

}

自定义数据源DataSource

可能有些场景我们不想使用SpringBoot JDBC默认的数据源,我需要引入数据库连接池,然后自定义数据源,指定数据源类型。下面以Dbcp2数据库连接池配置数据源为例:

1. 引入dbcp2的数据库连接池已经相关依赖。

org.apache.commons

commons-dbcp2

2.7.0

mysql

mysql-connector-java

8.0.18

org.springframework

spring-jdbc

5.2.2.RELEASE

compile

2. 在application.properties文件中配置数据库连接属性。

customize.datasource.url=jdbc:mysql://localhost:3306/blue?serverTimezone=UTC

customize.datasource.username=root

customize.datasource.password=wan4380797

customize.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3. 自定义DataSource

import org.apache.commons.dbcp2.BasicDataSource;

@Configuration

public class Dbcp2DataSource {

@Bean("myDbcp2DataSource")

@ConfigurationProperties(prefix = "customize.datasource")

public DataSource getDataSource(){

return DataSourceBuilder.create().type(BasicDataSource.class).build();

}

}

这边我们可以看到我们创建的DataSource类型为BasicDataSource类型的。并且BasicDataSource来源于之前配置的dbcp2依赖的jar包中。下面我们使用junit来验证以下数据源配置的正确与否:

@SpringBootTest

@RunWith(SpringRunner.class)

public class JdbcCustomizeDatasourceApplicationTests {

@Autowired

@Qualifier("myDbcp2DataSource")

private DataSource dataSource;

@Test

public void springJdbcTemplateTest(){

try{

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

String queryStr = "select * from student";

List resultList = new ArrayList<>();

jdbcTemplate.query(queryStr, (ResultSet resultSet)->{

Student student = new Student();

student.setId(resultSet.getString("id"));

student.setStudentId(resultSet.getString("student_id"));

student.setStudentName(resultSet.getString("student_name"));

student.setAge(resultSet.getInt("age"));

resultList.add(student);

});

resultList.forEach((Student student) -> System.out.println(student));

}catch (Exception exception){

exception.printStackTrace();

}

}

}

✨ 相关推荐

跑跑卡丁车尾流是什么
365bet提款限制

跑跑卡丁车尾流是什么

📅 08-21 👀 4097
什么肠什么道的成语
det365在线平台

什么肠什么道的成语

📅 07-05 👀 2502
呱呱坠地的解释
beat365最新版体育

呱呱坠地的解释

📅 07-24 👀 3367