SpringBoot配置数据源DataSource
github源码地址:
SpringBoot如何快速配置数据源?有如下两种⽅式:
通过spring-boot-starter-jdbc快速配置数据源
⾃定义数据源DataSource
⾸先我们需要明确数据源DataSource有什么作⽤:
1. 通过DataSource可以获取数据库连接Connection
2. 通过DataSource创建JdbcTemplate操作数据库
实际项⽬中,我们在配置数据源的时候会指定数据库连接池,⽐如流⾏的Hikari(spring默认的数据库连接池)、C3p0、Dbcp2以及阿⾥巴巴的Druid。应⽤在操作数据库的时候,直接从数据库连接池获取连接,⽽不需要每次创建新的连接。⾄于数据库连接池的好处,总结就是: 应⽤创建和销毁连接的代价是很⼤的,使⽤数据库连接池可以很好的复⽤连接,节省开销,⽅便管理,简化开发。
通过spring-boot-starter-jdbc快速配置数据源
1. 引⼊maven依赖。
<!--spring-boot-starter-jdbc⾃动配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
2.在application.properties⽂件中配置数据库连接属性。
spring.datasource.url=jdbc:mysql://localhost:3306/blue?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=wan4380797
spring.datasource.sql.cj.jdbc.Driver
(PS: 关于数据库驱动版本的⼩知识,当connector版本是6.0以前的使⽤sql.jdbc.Driver,6.0以后的使⽤
上⾯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 = Connection();
Statement statement = ateStatement();
ResultSet resultSet = uteQuery("select * from student");
Student student = null;
()){
student = new Student();
student.String("id"));
student.String("student_id"));
student.String("student_name"));
student.Int("age"));
}
System.out.println(student);
statement.close();
connection.close();
}catch (Exception exception){
exception.printStackTrace();
}
}
}
⾃定义数据源DataSource
可能有些场景我们不想使⽤SpringBoot JDBC默认的数据源,我需要引⼊数据库连接池,然后⾃定义数据源,指定数据源类型。下⾯以Dbcp2数据库连接池配置数据源为例:
1. 引⼊dbcp2的数据库连接池已经相关依赖。
<!-- dbcp2数据库连接池 -->
<dependency>
<groupId>org.apachemons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!-- 提供操作数据库的标准⼝径 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
<scope>compile</scope>
</dependency>
2. 在application.properties⽂件中配置数据库连接属性。
customize.datasource.url=jdbc:mysql://localhost:3306/blue?serverTimezone=UTC
customize.datasource.username=root
customize.datasource.password=wan4380797
customize.datasource.sql.cj.jdbc.Driver
3. ⾃定义DataSource
import org.apachemons.dbcp2.BasicDataSource;
@Configuration
public class Dbcp2DataSource {
@Bean("myDbcp2DataSource")
@ConfigurationProperties(prefix = "customize.datasource")
public DataSource getDataSource(){
ate().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<Student> resultList = new ArrayList<>();
jdbcTemplate.query(queryStr, (ResultSet resultSet)->{
Student student = new Student();
student.String("id"));
student.String("student_id"));
student.String("student_name"));
student.Int("age"));
resultList.add(student);
});
resultList.forEach((Student student) -> System.out.println(student));
druid连接池配置详解}catch (Exception exception){
exception.printStackTrace();
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论