JDBC(Java DataBase Connectivity)就是Java数据库连接,简单来说就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句,接下来演示一下 Spring Boot 的数据配置,并且将多数据源配置同Mybatis-plus相结合。
目录
1 Docker 环境下安装 Mysql
1.1 腾讯云服务器系统选择
1.2 通过 Docker 启动 Mysql
①获取镜像
②创建容器
③安全组
④测试连接
2 配置单数据源
2.1 创建项目
2.2 配置属性
2.3 数据库连接展示
2.4 JDBC 查询操作
3 Spring Boot 配置多数据源
3.1 前提--排布&两个数据源
3.2 配置两组 DataSource
3.3 制定主库,多数据源结合 mybatis-plus
3.4 Dao层 & controlller层
3.5 启动类排除自动配置&运行
3.6 查看运行结果
4 连接池介绍
4.1 基本原理
4.2 HikariCP 连接池
① Spring Boot 2.X 版本默认使用 HikariCP
② Hikari 连接池常用配置含义:
③具体配置--多数据源
4.3 Druid 连接池
①实用功能:
②添加 druid-spring-boot-starter 依赖
③具体配置--单数据源!
1 Docker 环境下安装 Mysql
1.1 腾讯云服务器系统选择
为了简化搭建时的工作,选择腾讯云服务器的 Docker 容器,初次选择系统和重装系统都可以选择 Docker 镜像:
1.2 通过 Docker 启动 Mysql
①获取镜像
默认最新版,也可加版本号,如 mysql:5.7.28
docker pull mysql
②创建容器
docker run --name mysql -p 3307:3306 -v /data/mysql/datadir:/var/lib/mysql -v /data/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql
参数说明:
- –name mysql 容器别名
- -p 3307:3306 端口映射(本机3307端口映射容器3306端口)
- -v /data/mysql/datadir:/var/lib/mysql 目录映射(mysql数据目录)
- -v /data/mysql/conf.d:/etc/mysql/conf.d 目录映射(mysql配置目录)
- -e MYSQL_ROOT_PASSWORD 设置 MySQL 服务 root 用户的密码
- -d 后台运行
③安全组
④测试连接
使用 DBeaver 测试连接是否成功 👇
2 配置单数据源
2.1 创建项目
本文通过编译器 IDEA 实现:
①New Project
②添加 Mysql 驱动和 JDBC 依赖
也可在之前的项目的 pom.xml 文件中直接添加Mysql 驱动和 JDBC 依赖~
2.2 配置属性
如下,连接数据库需要进行如下配置👇
路径:src/main/resources/application.properties
#数据源常用配置
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/
#可选
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2.3 数据库连接展示
启动类中添加如下代码👇
@SpringBootApplication
@Slf4j
public class DataSourceDemoApplication implements CommandLineRunner {
@Autowired
private DataSource dataSource;
public static void main(String[] args) {
SpringApplication.run(DataSourceDemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
log.info(dataSource.toString());
Connection connection = dataSource.getConnection();
log.info(connection.toString());
connection.close();
}
}
运行可看到 DataSource 和 DataSource Pool 信息👇
2.4 JDBC 查询操作
填写完正确的数据库链接后就可以使用JDBC进行相关操作了~
路径:src/main/java/com/yinyu/datasourcedemo/DataSourceDemoApplication.java
@Autowired
private JdbcTemplate jdbcTemplate; //注入
//查询展示数据
private void showData(){
jdbcTemplate.queryForList("SELECT * FROM student")
.forEach(row -> System.out.println(row.toString()));
}
将 showData 方法放在 run 方法下边👇
执行启动类,就可以看到查询到的数据了,不过前提是所配置的数据库里边有表~
3 Spring Boot 配置多数据源
3.1 前提--排布&两个数据源
项目排布:
我是用的云服务器的 Mysql,然后通过 dbeaver 进行操作,idea 的Database也挺好用(类似dbeaver)。
3.2 配置两组 DataSource
若配置多数据源,需要将 jdbc-url 替换成 url
路径:src/main/resources/application.properties
#多数据源data01
spring.datasource.data01.jdbc-url=jdbc:mysql://127.0.0.1:3306/data01?characterEncoding=utf8&
spring.datasource.data01.username=root
spring.datasource.data01.password=root
spring.datasource.data01.driver-class-name=com.mysql.cj.jdbc.Driver
#多数据源data2
spring.datasource.data02.jdbc-url=jdbc:mysql://127.0.0.1:3306/data02?characterEncoding=utf8&
spring.datasource.data02.username=root
spring.datasource.data02.password=root
spring.datasource.data02.driver-class-name=com.mysql.cj.jdbc.Driver
3.3 制定主库,多数据源结合 mybatis-plus
Ⅰ 添加 mybatis-plus 依赖:
<!--.mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
Ⅱ 数据源配置代码:
相关知识点:
- 使用@Bean可以创建一个bean对象交给spring容器管理
- @Bean创建的bean对象的名称默认为方法名,也可以指定
- @Bean方法参数表示,接收一个bean对象,默认按照type类型接收注入的对象,若要修改为byName方式,可以使用@Qualifier注解注入准确的对象
- @Primary表示该bean为此类型的默认bean,在其他地方引用的时候用@Autowired即可按照类型注入,不受同类型多个对象影响
路径:src/main/java/com/yinyu/datasourcedemo/datasource/DataSource01Config.java
package com.yinyu.datasourcedemo.datasource;
//省去引入的类
@Configuration//注入到spring容器中
//扫描dao层,并且给dao层注入指定的sqlSessionFactory
@MapperScan(basePackages = "com.yinyu.datasourcedemo.data01",sqlSessionFactoryRef = "sqlSessionFactory01")
public class DataSource01Config {
/**
* 数据源对象
* @return
*/
@Bean(name = "dataSource01")//使用@Bean可以创建一个bean对象交给spring容器管理
@Primary//表示它是主数据库,表示默认的对象
@ConfigurationProperties(prefix = "spring.datasource.data01")//表示默认读取spring.datasource.data01开头的节点
public DataSource dataSource01(){
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "sqlSessionFactory01")
public SqlSessionFactory sqlSessionFactory01(@Qualifier("dataSource01") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//我们采用的是注解的方式,如果写了mapper.xml文件就需要用下面这句话
//bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:"));
return bean.getObject();
}
@Primary
@Bean(name = "transactionManager01")
public DataSourceTransactionManager transactionManager01(@Qualifier("dataSource01")DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
@Primary
@Bean(name = "sessionTemplate01")
public SqlSessionTemplate sessionTemplate01(@Qualifier("sqlSessionFactory01")SqlSessionFactory sessionFactory){
return new SqlSessionTemplate(sessionFactory);
}
}
路径:src/main/java/com/yinyu/datasourcedemo/datasource/DataSource02Config.java
package com.yinyu.datasourcedemo.datasource;
//省去引入的类
@Configuration//注入到spring容器中
@MapperScan(basePackages = "com.yinyu.datasourcedemo.data02",sqlSessionFactoryRef = "sqlSessionFactory02")
public class DataSource02Config {
//数据源对象
@Bean(name = "dataSource02")
@ConfigurationProperties(prefix = "spring.datasource.data02")
public DataSource dataSource02(){
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory02")
public SqlSessionFactory sqlSessionFactory02(@Qualifier("dataSource02") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:"));
return bean.getObject();
}
@Bean(name = "transactionManager02")
public DataSourceTransactionManager transactionManager02(@Qualifier("dataSource02")DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sessionTemplate02")
public SqlSessionTemplate sessionTemplate02(@Qualifier("sqlSessionFactory02")SqlSessionFactory sessionFactory){
return new SqlSessionTemplate(sessionFactory);
}
}
3.4 Dao层 & controlller层
注释含义:
- @Component:定义一个通用的Bean
- @Repository:数据操作的仓库的Bean
- @Service:业务的服务的Bean
- @RestController:SpringMVC接口注释
ⅠDao层--StudentMapper 和 StudentMapper
路径:src/main/java/com/yinyu/datasourcedemo/data01/mapper/StudentMapper.java
//创建一个简单的 mapper,简单到不继承BaseMapper
@Repository//代表持久层
public interface StudentMapper{
//查询student,也可创建student实体类替代Map
@Select("select * from student")
List<Map<String,Object>> selectStudent();
}
路径:src/main/java/com/yinyu/datasourcedemo/data02/mapper/UserMapper.java
//创建一个简单的 mapper,简单到不继承BaseMapper
@Repository//代表持久层
public interface StudentMapper{
//查询student,也可创建student实体类替代Map
@Select("select * from student")
List<Map<String,Object>> selectStudent();
}
Ⅱ 直接到 controller 层
路径:src/main/java/com/yinyu/datasourcedemo/controller/IndexController.java
@RestController//这个注解包含了@ResponseBody和@Controller配合,这个类中的方法返回的都是json
public class IndexController {
@Autowired
//主数据源
private StudentMapper studentMapper;
@Autowired//表示按名称自动注入
//第二个数据源
private UserMapper userMapper;
@RequestMapping("/student")
public Object getStudent(){
return studentMapper.selectStudent();
}
@RequestMapping("/user")//对外的访问路径
public Object getUser(){
return userMapper.selectUser();
}
}
3.5 启动类排除自动配置&运行
路径:src/main/java/com/yinyu/datasourcedemo/DataSourceDemoApplication.java
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class})
@Slf4j
public class DataSourceDemoApplication{
public static void main(String[] args) {
SpringApplication.run(DataSourceDemoApplication.class, args);
}
}
3.6 查看运行结果
启动成功👇
查询/student接口成功👇
查询/user接口成功👇
4 连接池介绍
连接池,英文名:Connection Pool ,是创建和管理一个连接的缓冲池的技术,简单来说,连接池就是为了提高性能
4.1 基本原理
- Ⅰ 建立数据库连接池对象(服务器启动)
- Ⅱ 按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)
- Ⅲ 对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
- Ⅳ 存取数据库
- Ⅴ 关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)
- Ⅵ 释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)
不使用连接池后果:占用服务器的内存资源,导致服务器的速度非常慢
可以说连接池就是为了避免重复多次的打开数据库连接而造成的性能的下降和系统资源的浪费。
4.2 HikariCP 连接池
Hikari 用日语翻译过来就是“光”的意思,可见其速度之快。
① Spring Boot 2.X 版本默认使用 HikariCP
因为本项目用的是 2.X 版本的 Spring Boot ,而且默认使用 HikariCP ,因此只需要在application.properties 配置文件中修改 spring.datasource.hikari.* 就行。
注:spring.datasource.type - 指定 spring 连接数据源类型
② Hikari 连接池常用配置含义:
- minimum-idle:最小空闲连接数量
- idle-timeout:空闲连接存活最大时间,默认600000(10分钟)
- maximum-pool-size:连接池最大连接数,默认是10
- auto-commit:此属性控制从池返回的连接的默认自动提交行为,默认值:true
- pool-name:连接池名称
- max-lifetime:此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
- connection-timeout:数据库连接超时时间,默认30秒,即30000
③具体配置--多数据源
路径:src/main/resources/application.properties
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
然后就像之前一样正常启动就行了~~
4.3 Druid 连接池
Druid 连接池是阿里巴巴开源的数据库连接池项目,可以说是Java语言最好的数据库连接池之一。
①实用功能:
- 详细的监控
- ExceptionSorter,针对主流数据库的返回码都有支持
- SQL防注入
- 内置加密配置
- 众多扩展点,方便进行定制
②添加 druid-spring-boot-starter 依赖
<!--.druid连接池依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
③具体配置--单数据源!
目前只找到单数据源的配置方法,多数据源配置 Druid 还没实现,因此需要将之前的多数据源配置重置回单数据源配置。
路径:src/main/resources/application.properties
#使用druid数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&
spring.datasource.druid.username=root
spring.datasource.druid.password=root
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
# 初始化大小,最小,最大
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.min-evictable-idle-time-millis=300000
#检测连接是否有效的sql
spring.datasource.druid.validation-query=SELECT 'x'
spring.datasource.druid.validation-query-timeout=60000
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
# PSCache Mysql下建议关闭
spring.datasource.druid.pool-prepared-statements=false
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=-1
#spring.datasource.druid.max-open-prepared-statements= #等价于上面的max-pool-prepared-statement-per-connection-size
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙,#别名方式,扩展插件,监控统计用的filter:stat,日志用的filter:log4j,防御sql注入的filter:wall
spring.datasource.druid.filters=stat,wall,slf4j