任务描述
任务要求
使用IDEA开发工具构建一个项目多模块工程。study-springboot-chapter05学习关于Springboot如何使用数据源
- 基于study-springboot工程,新建一个Maven空项目,坐标groupId(com.cbitedu)、artifactId(study-springboot-chapter04),其他默认
- 继承study-springboot工程依赖
- 详细学习数据源知识和如何在项目中应用和调整数据源相应参数。
任务收获
- 如何集成第三方持久技术数据源HikariCP号称性能最好的数据库连接池和 Druid ,为监控而生的数据库连接池。
- 如何引入MySQL数据库依赖
- Spring Boot中整合数据源:主要是以Spring JDBC为例来演示HikariCP数据源的配置
- 学会使用JUnit完成单元测试
- 掌握数据源在项目中的应用
任务准备
环境要求
- JDK1.8+
- MySQL8.0.27+
- Maven 3.6.1+
- IDEA/VSCode
数据库准备
创建数据库platform,并创建用户表和初始化用户表数据。
/*
Navicat Premium Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 80029
Source Host : localhost:3306
Source Schema : platform
Target Server Type : MySQL
Target Server Version : 80029
File Encoding : 65001
Date: 20/08/2022 14:13:09
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_sys_userinfo
-- ----------------------------
DROP TABLE IF EXISTS t_sys_userinfo;
CREATE TABLE t_sys_userinfo (
user_id varchar(32) NOT NULL,
username varchar(50) NOT NULL COMMENT '用户名',
password varchar(100) DEFAULT NULL COMMENT '密码',
salt varchar(20) DEFAULT NULL COMMENT '盐',
email varchar(100) DEFAULT NULL COMMENT '邮箱',
mobile varchar(100) DEFAULT NULL COMMENT '手机号',
status tinyint DEFAULT NULL COMMENT '状态 0:禁用 1:正常',
create_user_id varchar(32) NULL DEFAULT NULL COMMENT '创建者ID',
create_time varchar(32) DEFAULT NULL COMMENT '创建时间',
userimg varchar(255) DEFAULT NULL COMMENT '用户头像',
zip varchar(10) DEFAULT NULL COMMENT '邮政编码',
sort_num int DEFAULT NULL COMMENT '排序号',
user_type varchar(10) DEFAULT NULL COMMENT '用户类型',
post_id varchar(32) DEFAULT NULL COMMENT '所属岗位',
sex varchar(4) DEFAULT NULL COMMENT '性别',
USER_REALNAME varchar(50) DEFAULT NULL COMMENT '真实姓名',
user_theme varchar(255) DEFAULT NULL COMMENT '用户选择皮肤',
user_card varchar(18) DEFAULT NULL COMMENT '身份证号码',
birthday varchar(20) DEFAULT NULL COMMENT '出生年月',
native_place varchar(255) DEFAULT NULL COMMENT '家庭住址',
nation varchar(255) DEFAULT NULL COMMENT '民族',
update_user_id varchar(32) DEFAULT NULL COMMENT '创建者ID',
update_time varchar(32) DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (user_id) USING BTREE,
UNIQUE INDEX username(username ASC) USING BTREE
) COMMENT = '系统用户' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_sys_userinfo
-- ----------------------------
INSERT INTO t_sys_userinfo VALUES ('1', 'admin', '9ec9750e709431dad22365cabc5c625482e574c74adaebba7dd02f1129e4ce1d', 'YzcmCZNvbXocrsz9dm8e', 'cc@bluefairy.com', '18929423839', 1, '1', '2016-11-11 11:11:11', NULL, NULL, NULL, NULL, NULL, NULL, '系统管理员', 'green', NULL, NULL, NULL, NULL, NULL, NULL);
SET FOREIGN_KEY_CHECKS = 1;
工程目录要求
新建一个空的Maven项目:study-springboot-chapter05
数据源(Data Source),以及Spring Boot中对数据源的创建与配置。
任务实施
学习在Spring Boot中使用HikariCP连接池
基本概念
在开始说明Spring Boot中的数据源配置之前,我们先搞清楚关于数据访问的这些基本概念:
什么是JDBC?
Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
JDBC API主要位于JDK中的java.sql包中(之后扩展的内容位于javax.sql包中),主要包括(斜体代表接口,需驱动程序提供者来具体实现):
- DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
- Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)。
- Connection:数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。
- Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。
- CallableStatement:用以调用数据库中的存储过程。
- SQLException:代表在数据库连接的建立和关闭和SQL语句的执行过程中发生了例外情况(即错误)。
什么是数据源?
可以看到,在java.sql中并没有数据源(Data Source)的概念。这是由于在java.sql中包含的是JDBC内核API,另外还有个javax.sql包,其中包含了JDBC标准的扩展API。而关于数据源(Data Source)的定义,就在javax.sql这个扩展包中。
实际上,在JDBC内核API的实现下,就已经可以实现对数据库的访问了,那么我们为什么还需要数据源呢?主要出于以下几个目的:
- 封装关于数据库访问的各种参数,实现统一管理
- 通过对数据库的连接池管理,节省开销并提高效率
在Java这个自由开放的生态中,已经有非常多优秀的开源数据源可以供大家选择,比如:DBCP、C3P0、Druid、HikariCP等。
而在Spring Boot 2.x中,对数据源的选择也紧跟潮流,采用了目前性能最佳的HikariCP。接下来,我们就来具体说说,这个Spring Boot中的默认数据源配置。
默认数据源:HikariCP
由于Spring Boot的自动化配置机制,大部分对于数据源的配置都可以通过配置参数的方式去改变。只有一些特殊情况,比如:更换默认数据源,多数据源共存等情况才需要去修改覆盖初始化的Bean内容。我们主要讲Hikari的配置,所以对于使用其他数据源或者多数据源的情况,在之后的教程中学习。
在Spring Boot自动化配置中,对于数据源的配置可以分为两类:
-
通用配置:以spring.datasource.*的形式存在,主要是对一些即使使用不同数据源也都需要配置的一些常规内容。比如:数据库链接地址、用户名、密码等。这里就不做过多说明了,通常就这些配置:
spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver -
数据源连接池配置:以spring.datasource.<数据源名称>.*的形式存在,比如:Hikari的配置参数就是spring.datasource.hikari.*形式。下面这个是我们最常用的几个配置项及对应说明:
spring.datasource.hikari.minimum-idle=10 spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.idle-timeout=500000 spring.datasource.hikari.max-lifetime=540000 spring.datasource.hikari.connection-timeout=60000 spring.datasource.hikari.connection-test-query=SELECT 1 -
这些配置的含义:
- spring.datasource.hikari.minimum-idle: 最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size
- spring.datasource.hikari.maximum-pool-size: 最大连接数,小于等于0会被重置为默认值10;大于零小于1会被重置为minimum-idle的值
- spring.datasource.hikari.idle-timeout: 空闲连接超时时间,默认值600000(10分钟),大于等于max-lifetime且max-lifetime>0,会被重置为0;不等于0且小于10秒,会被重置为10秒。
- spring.datasource.hikari.max-lifetime: 连接最大存活时间,不等于0且小于30秒,会被重置为默认值30分钟.设置应该比mysql设置的超时时间短
- spring.datasource.hikari.connection-timeout: 连接超时时间:毫秒,小于250毫秒,否则被重置为默认值30秒
- spring.datasource.hikari.connection-test-query: 用于测试连接是否可用的查询语句
首先,为了连接数据库需要引入jdbc支持,在pom.xml中引入如下配置
Spring Boot 2 默认使用了 HikariCP,所以 HikariCP 会默认在 spring-boot-starter-jdbc 中附加依赖,因此不需要主动添加 HikariCP 的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
以MySQL数据库为例,先引入MySQL连接的依赖包,在pom.xml中加入:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
在src/main/resources/application.yml中配置数据源信息
#服务配置
server:
port: 81
# #设置日志相关打印sql 语句
logging:
level:
top.com.cbitedu: info
#关闭运行日志图标(banner)
spring:
datasource:
url: jdbc:mysql://localhost:3306/platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
hikari:
auto-commit: true
cachePrepStmts: true
connection-test-query: SELECT 1
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 28740000
maximum-pool-size: 15
minimum-idle: 5
pool-name: DatebookHikariCP
prepStmtCacheSize: 300
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
注意:因为Spring Boot 2.1.x默认使用了MySQL 8.0的驱动,所以这里采用com.mysql.cj.jdbc.Driver,而不是老的com.mysql.jdbc.Driver。
单元测试:查看控制台打印hikari信息
package com.cbitedu.springboot.web;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.sql.DataSource;
import java.util.UUID;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringJDBCDataSourceTemplateTest {
@Test
public void contextLoads() {
}
private static final Logger logger = LoggerFactory.getLogger(SpringJDBCDataSourceTemplateTest.class);
@Autowired
private DataSource dataSource;
@Test
public void testConnection() throws Exception {
logger.info("当前数据源 = {}", dataSource.getConnection());
}
}
实验实训
Druid是Java语言中最好的数据库连接池。结合了 C3P0、DBCP 等数据库连接池的优点,Druid能够提供强大的监控和扩展功能。
1、完成国产数据源druid配置和实践
2、配置实现druid监控
3、数据库安全:加密数据库密码