一、导入场景
1. 导入 JDBC 场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
此时,导入了数据源、 jdbc 、事务 ;
未导入数据库驱动——原因是不知道用何种数据库
2. 导入 MySQL 驱动
SpringBoot 官方仲裁的 MySQL 驱动版本为 8.0.22,但是我的 MySQL 版本为 5.7,因此需要切换驱动版本,其两种方法如下
方法一:就近依赖,直接引入 5.1.49
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version> <!--官方仲裁了版本 8.0.22 - 数据库版本要和驱动版本要一致(5.7)-->
</dependency>
方法二:在当前项目中重新声明仲裁的版本(Maven 属性的就近优先原则)
<properties>
<mysql.version>5.1.49</mysql.version>
</properties>
二、修改配置项
在 application.yaml 里加入如下配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/xxxxName
username: root
password: 5201314love
driver-class-name: com.mysql.jdbc.Driver
解释:
- url :数据库访问地址 ,访问本地 MySQL 数据库前缀都是 jdbc:mysql://localhost:3306, xxxxName为要建立连接的数据库名
- username,password: 为自己数据库的设置的用户名和密码
- driver-class-name: 数据库驱动类名,mysql 的驱动类名为com.mysql.jdbc.Driver
原理分析
导入的自动配置类
-
DataSourceAutoConfiguration —— 数据源的自动配置组件 ,修改
spring.datasource
配置项修改数据源的配置
-
DataSourceTransactionManagerAutoConfigutation —— 事务管理的自动配置组件
-
jdbcTemplateAutoConfiguration —— jdbcTemplate 的自动配置组件,可以用来对数据进行 crud。通过修改配置项
spring.jdbc
来修改jdbcTemplate的自动配置
-
… 其他自动配置类…
三、使用 jdbcTemplate 进行数据库连接的测试
jdbcTemplateAutoConfiguration其在容器中放了 jdbcTemplate 这个组件用来对数据库进行操作
@Bean
@Primary
JdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
JdbcProperties.Template template = properties.getTemplate();
jdbcTemplate.setFetchSize(template.getFetchSize());
jdbcTemplate.setMaxRows(template.getMaxRows());
if (template.getQueryTimeout() != null) {
jdbcTemplate.setQueryTimeout((int) template.getQueryTimeout().getSeconds());
}
return jdbcTemplate;
}
我们可以通过 SpringBoot 提供的自动测试类对数据库是否连接成功进行单元测试,自动测试类位于:
测试代码如下:
我的数据库中有一 orders 表,下面代码为查看 orders 表中有多少条记录,通过这个测试数据库是否连接成功
@Slf4j
@SpringBootTest
class DemoAdminApplicationTests {
@Autowired // 自动注入注解
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
Long along = jdbcTemplate.queryForObject("select count(*) from orders", Long.class);
log.info("订单表中的记录数为" + along);
}
}