SpringBoot6-1 --数据访问/整合基本JDBC和Druid

2024-02-05 05:18

本文主要是介绍SpringBoot6-1 --数据访问/整合基本JDBC和Druid,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用的版本号:2.0以上
与关系型数据库交互
使用的技术
JDBC,MyBatis(持久层框架),Spring Data JPA(springboot 底层默认与关系型数据库交互的处理方式)
spring boot与数据库的交互依靠的是底层的Spring Data(绝不仅仅是关系型数据库)
spring boot所有的数据处理都是基于 spring boot 的 SpringData

一:整合基本使用的JDBC数据源

1. 配置JDBC数据源
导入的依赖:mysql 驱动 jdbc start web start
配置数据库:

properties.yml 配置
spring:datasource:username: rootpassword: 12345url: jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Driver
配置JDBC数据源驱动

异常处理:https://blog.csdn.net/Stitch__/article/details/88817898

2. 使用JDBC数据源操作操作数据库

spring Boot自动配置了:jdbcTemplate (属于Spring底层对数据库的操作)
https://blog.csdn.net/Stitch__/article/details/88831518

例如:
@Controller
public class helloController {@AutowiredJdbcTemplate jdbcTemplate;@ResponseBody@GetMapping("/query")public Map<String,Object> hello(){List<Map<String,Object>> list = jdbcTemplate.queryForList("select * from department");System.out.println("访问数据库");return list.get(0);}
}

JDBC配置的原理

配置文件中所以有与数据库相关的配置,都在DataSourceProperties 这个类中

1. DataSourceConfiguration
配置数据源;向容器中@Bean 添加数据源【根据配置文件:驱动和类型(使用默认就不用配置type )】

这里的数据源可以理解为连接池

   springboot 支持多种数据源:1. com.zaxxer.hikari.HikariDataSource  2. org.apache.tomcat.jdbc.pool.DataSource 3. dbcp24. BasicDataSource5. 自定义数据源类型:配置了type

每一个数据源添加的条件:例如 tomcat.jdbc.pool.DataSource

@ConditionalOnClass({org.apache.tomcat.jdbc.pool.DataSource.class})   导入了相关的依赖
@ConditionalOnMissingBean({DataSource.class})      容器中没有DataSource(连接池)
@ConditionalOnProperty(name = {"spring.datasource.type"},           havingValue = "org.apache.tomcat.jdbc.pool.DataSource", 在配置文件中type 配置为matchIfMissing = true                            但是没配也没事,就相当于你配置了)

总结:要使用默认的数据源

  1. 导入相关的依赖
  2. 没有自定义的数据源
  3. ★同时如果你想要使用自定义的数据源,只要向容器中导入自己的DataSource 就可以了

关于默认数据源的配置要补充的地方:

  1. 2.0以下的版本数据源:com.apache.tomcat.jdbc.pool.DataSource 默认以这个连接池作为数据源
    2.0以上的版本数据源:hikari.HikariDataSource 默认以这个连接池作为数据源
  2. 原因:HikariDataSource 性能优于tomcat ;你从SpringBoot 的源码上也可以判断是否添加tomcat 数据源的条件:@ConditionalOnClass({org.apache.tomcat.jdbc.pool.DataSource.class}) 这个类是点不进去的;证明springBoot 没有这个类

2. DataSourceInitializer

作用:读取相关的文件
1. createSchema 运行建表语句
2. 运行插入数据的sql 语句
默认只需要将文件名命名为:`schema-*.sql【建表】  data-*.sql【插入数据】` 
[直接将sql 语句写在文件中]
【跟Spring 中的嵌入式数据库的性质一样】自定义文件名,并修改application.properties 配置文件
schema :- classpath:自定义的sql 文件     department.sql   
此时建表读取的文件就是类路径下的department.sql
【schema 下可以的数据是一个数组,- 值  classpath:department.sql 是一个值】 
数据库xx.sql 文件完成对数据库的初始化操作(完整的配置)
spring:datasource:username: rootpassword: 12345url: jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Driverschema:- classpath:mysql/department.sqlinitialization-mode: always
值得注意的是:
1. 在.yml 文件中 要十分注意缩进
2. springboot2.x 版本和2.0以下的版本在配置上是有不一样的 

Jdbc模板配置原理:
JdbcTemplateAutoConfiguration
在SpringBoot 在JdbcTemplateAutoConfiguration配置类中将JDBC的操作模板:jdbcTemplate,NamedParameterJdbcTemplate自动添加到容器中


自定义数据源的创建原理:根据DataSourceConfiguration

@ConditionalOnMissingBean({DataSource.class})@ConditionalOnProperty(name = {"spring.datasource.type"})static class Generic {Generic() {}@Beanpublic DataSource dataSource(DataSourceProperties properties) {return properties.initializeDataSourceBuilder().build();}}

分析:以druid 为例
initializeDataSourceBuilder() 【DataSourceProperties 中的方法】根据配置文件中的驱动名称,用户名,密码创建连接池创建者:

return 
DataSourceBuilder.create(this.getClassLoader()).type(this.getType()).driverClassName(this.determineDriverClassName()).url(this.determineUrl()).username(this.determineUsername()).password(this.determinePassword());

创建者根据type 的值,反射创建连接池:
DataSource result = (DataSource)BeanUtils.instantiateClass(type);


二:整合druid数据源

导入druid 依赖

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.15</version>
</dependency>

修改配置文件:

spring:datasource:username: rootpassword: 12345url: jdbc:mysql://localhost:3306/jdbc?serverTimezone=UTCdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
这是自定义的数据源所以要进行所有的配(连接池,大小等)
#   数据源其他配置initialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: true
#   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙  filters: stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize: 20useGlobalDataSourceStat: true  connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500  

默认的数据源所由的配置都是和DataSourceproperties 类绑定的,但是自定义的配置在这个类中是没有的。所以自己后边设置的配置无法和DataSourceProperties 绑定,配置不会生效
所以要将自定义数据源(不利用反射创建)添加到容器中,并且配置Druid 的后台管理Servlte和web 监控的filter

@Configuration
public class druidConfig {//将自定义的数据源加入容器中@ConfigurationProperties(prefix = "spring.datasource" )@Beanpublic DataSource DruidConfig(){return  new DruidDataSource();//配置文件中的所有配置在DruidDataSource 中都有对应的字段}//配置Druid 的监控//1. 管理后台的servlet@Beanpublic ServletRegistrationBean statViewServlet(){ServletRegistrationBean bean =new ServletRegistrationBean(new StatViewServlet(),"/druid/*");//可以配置基本的参数Map<String,String> map = new HashMap<String,String>();//设置初始化参数map.put("loginUsername","statViewServlet");map.put("loginPassword","initial");//配置登陆后台的账户密码//配置允许什么访问,拒绝什么访问map.put("allow","");map.put("deny","192.168.135.1");bean.setInitParameters(map);return bean;}//2. web 后台filter@Beanpublic FilterRegistrationBean webstatFilter(){FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new WebStatFilter());//设置初始化参数Map<String,String> map = new HashMap<String,String>();map.put("exclusions","*.js,*.css,/druid/*");//排除那些不拦截bean.setInitParameters(map);//设置拦截的访问bean.setUrlPatterns(Arrays.asList("/*"));return bean;}

配置web 监控的Filter,要注意与之前写过的拦截器之间的对比,不要混淆

本次学习的疑惑: @ConditionalOnMissingBean({DataSource.class}) 什么意思???

这篇关于SpringBoot6-1 --数据访问/整合基本JDBC和Druid的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/679834

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查