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 依赖
③具体配置--单数据源!
为了简化搭建时的工作,选择腾讯云服务器的 Docker 容器,初次选择系统和重装系统都可以选择 Docker 镜像:
默认最新版,也可加版本号,如 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
参数说明:
使用 DBeaver 测试连接是否成功
本文通过编译器 IDEA 实现:
①New Project
②添加 Mysql 驱动和 JDBC 依赖
也可在之前的项目的 pom.xml 文件中直接添加Mysql 驱动和 JDBC 依赖~
如下,连接数据库需要进行如下配置
路径: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
启动类中添加如下代码
@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 信息
填写完正确的数据库链接后就可以使用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 方法下边
执行启动类,就可以看到查询到的数据了,不过前提是所配置的数据库里边有表~
项目排布:
我是用的云服务器的 Mysql,然后通过 dbeaver 进行操作,idea 的Database也挺好用(类似dbeaver)。
若配置多数据源,需要将 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
Ⅰ 添加 mybatis-plus 依赖:
com.baomidou
mybatis-plus-boot-starter
3.5.2
Ⅱ 数据源配置代码:
相关知识点:
路径: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);
}
}
注释含义:
Ⅰ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
路径:src/main/java/com/yinyu/datasourcedemo/data02/mapper/UserMapper.java
//创建一个简单的 mapper,简单到不继承BaseMapper
@Repository//代表持久层
public interface StudentMapper{
//查询student,也可创建student实体类替代Map
@Select("select * from student")
List
Ⅱ 直接到 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();
}
}
路径: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);
}
}
启动成功
查询/student接口成功
查询/user接口成功
连接池,英文名:Connection Pool ,是创建和管理一个连接的缓冲池的技术,简单来说,连接池就是为了提高性能
不使用连接池后果:占用服务器的内存资源,导致服务器的速度非常慢
可以说连接池就是为了避免重复多次的打开数据库连接而造成的性能的下降和系统资源的浪费。
Hikari 用日语翻译过来就是“光”的意思,可见其速度之快。
因为本项目用的是 2.X 版本的 Spring Boot ,而且默认使用 HikariCP ,因此只需要在application.properties 配置文件中修改 spring.datasource.hikari.* 就行。
注:spring.datasource.type - 指定 spring 连接数据源类型
路径: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
然后就像之前一样正常启动就行了~~
Druid 连接池是阿里巴巴开源的数据库连接池项目,可以说是Java语言最好的数据库连接池之一。
com.alibaba
druid-spring-boot-starter
1.2.8
目前只找到单数据源的配置方法,多数据源配置 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
springboot配置多数据源 - 走看看