06、数据访问(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 06、数据访问

06、数据访问

1、SQL

1、数据源的自动配置-HikariDataSource

1、导入JDBC场景

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>

864902fa0de469760e973ee1c8282d21.png


数据库驱动?

为什么导入JDBC场景,官方不导入驱动?官方不知道我们接下要操作什么数据库。

数据库版本和驱动版本对应

默认版本:<mysql.version>8.0.22</mysql.version>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
<!--            <version>5.1.49</version>-->
        </dependency>
想要修改版本
1、直接依赖引入具体版本(maven的就近依赖原则)
2、重新声明版本(maven的属性的就近优先原则)
    <properties>
        <java.version>1.8</java.version>
        <mysql.version>5.1.49</mysql.version>
    </properties>


2、分析自动配置

1、自动配置的类

DataSourceAutoConfiguration : 数据源的自动配置类

修改数据源相关的配置:spring.datasource

数据库连接池的配置,是自己容器中没有DataSource才自动配置的

底层配置好的连接池是:HikariDataSource

  @Configuration(proxyBeanMethods = false)
  @Conditional(PooledDataSourceCondition.class)
  @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
  @Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
      DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
      DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
  protected static class PooledDataSourceConfiguration

DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置


JdbcTemplateAutoConfiguration: JdbcTemplate(Spring提供的一个操作数据库的小工具)的自动配置,可以来对数据库进行crud


可以修改这个配置项@ConfigurationProperties(prefix = “spring.jdbc”) 来修改JdbcTemplate

@Bean @Primary JdbcTemplate;底层已经向容器中加入了这个组件.需要使用时直接使用@Autowired注入.

JndiDataSourceAutoConfiguration: jndi的自动配置


XADataSourceAutoConfiguration: 分布式事务相关的

3、修改配置项

spring:
  datasource:
    url: jdbc:mysql:///bookstore
    username: root
    password: 186259
    driver-class-name: com.mysql.jdbc.Driver

4、测试

@SpringBootTest
class Boot05AdminApplicationTests {
    @Autowired  //底层已经注入该组件,直接拿来用.
    private JdbcTemplate jdbcTemplate;
    @Test
    void contextLoads() {
        Integer count = jdbcTemplate.queryForObject("select count(*) from account", Integer.class);
        System.out.println(count);
    }
}

2、使用Druid数据源

1、druid官方github地址

https://github.com/alibaba/druid

整合第三方技术的两种方式


  • 自定义
  • 找starter

2、自定义方式

1、创建数据源

导入依赖

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

导入数据源

@Configuration
public class MyDataSourceConfig {
    //默认的自动配置是判断容器中没有才会配 HikariDataSource连接池.==>@ConditionalOnMissingBean(DataSource.class)
    @ConfigurationProperties("spring.datasource") //将该配置文件的值与数据源进行绑定
    @Bean
    public DataSource dataSource() throws SQLException {
        DruidDataSource druidDataSource = new DruidDataSource();
        // 打开Druid的监控统计功能. 开启防火墙.
        //druidDataSource.setFilters("stat,wall");
        return druidDataSource;
    }

2、使用Druid的内置监控页面(配置StatViewServlet)

官方文档========================================

StatViewServlet的用途包括:

  • 提供监控信息展示的html页面
  • 提供监控信息的JSON API
  <servlet>
    <servlet-name>DruidStatView</servlet-name>
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>DruidStatView</servlet-name>
    <url-pattern>/druid/*</url-pattern>
  </servlet-mapping>

实现代码:

/**
     * 配置Druid的监控页功能.
     * @return
     */
    @Bean
    public ServletRegistrationBean statViewServlet(){
        StatViewServlet statViewServlet = new StatViewServlet();
        ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
        //配置用户名,密码
        registrationBean.addInitParameter("loginUsername","admin");
        registrationBean.addInitParameter("loginPassword","admin");
        return registrationBean;
    }

3、打开Druid的监控统计功能(StatFilter)

官方文档

在spring中使用别名配置方式如下:

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    ... ...
    <property name="filters" value="stat" />
  </bean>

实现代码:

向DataSource数据源配置中加入:

druidDataSource.setFilters("stat");//打开Druid的监控统计功能


4.配置内置的Web监控

官方文档===============

WebStatFilter用于采集web-jdbc关联监控的数据。(如JDBC语句,请求次数,请求时间…)

web.xml配置

  <filter>
    <filter-name>DruidWebStatFilter</filter-name>
    <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
    <init-param>
      <param-name>exclusions</param-name>
      <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>DruidWebStatFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
 /**
     * webStatFilter用于采集web-jdbc关联监控的数据.
     * @return
     */
    @Bean
    public FilterRegistrationBean webStatFilter(){
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean <WebStatFilter> registrationBean = new FilterRegistrationBean <WebStatFilter>(webStatFilter);
        registrationBean.setUrlPatterns(Arrays.asList("/*"));
        registrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return registrationBean;
    }

5.配置防御SQL注入攻击(防火墙)

=官方文档

使用缺省配置的WallFilter

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      ...
      <property name="filters" value="wall"/>
  </bean>

实现代码:

向DataSource数据源配置中加入:

druidDataSource.setFilters("wall");//打开Druid的防火墙功能

以上的关于Spring数据源的配置都可以在配置文件中进行配置.

如用于统计监控信息;如SQL监控、URI监控

需要给数据源中配置如下属性;可以允许多个filter,多个用,分割;如:
<property name="filters" value="stat,slf4j" />

系统中所有filter:

image.png

慢SQL记录配置

<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
    <property name="slowSqlMillis" value="10000" />
    <property name="logSlowSql" value="true" />
</bean>
使用 slowSqlMillis 定义慢SQL的时长

3、使用官方starter方式

1、引入druid-starter

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>

2、分析自动配置

DruidDataSourceAutoConfigure

@Configuration
@ConditionalOnClass(DruidDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class) // 在DataSourceAutoConfiguration之前进行生效,这样使用的就是DruidDataSource
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class,
    DruidStatViewServletConfiguration.class,
    DruidWebStatFilterConfiguration.class,
    DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {

扩展配置项 spring.datasource.druid


DruidSpringAopConfiguration.class, 监控SpringBean的;配置项:spring.datasource.druid.aop-patterns


DruidStatViewServletConfiguration.class, 监控页的配置:spring.datasource.druid.stat-view-servlet;默认开启


DruidWebStatFilterConfiguration.class, web监控配置;spring.datasource.druid.web-stat-filter;默认开启


DruidFilterConfiguration.class}) 所有Druid自己filter的配置

    private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat";//stat
    private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";
    private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";
    private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";//slf4j
    private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";//log4j
    private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";
    private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";
    private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";//wall

3、配置示例

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_account
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    druid:
      aop-patterns: com.atguigu.admin.*  #监控SpringBean
      filters: stat,wall     # 底层开启功能,stat(sql监控),wall(防火墙)
      stat-view-servlet:   # 配置监控页功能
        enabled: true     # 进行开启,默认为false.
        login-username: admin
        login-password: admin
        resetEnable: false
      web-stat-filter:  # 监控web
        enabled: true
        urlPattern: /* # 过滤的路径
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'  # 排除路径
      filter:
        stat:    # 对上面filters里面的stat的详细配置
          slow-sql-millis: 1000
          logSlowSql: true
          enabled: true
        wall:
          enabled: true
          config:
            drop-table-allow: false  # 不允许山表操作.

SpringBoot配置示例


https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter


配置项列表https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8

相关文章
|
10月前
|
存储 对象存储 块存储
高性能数据存储有哪些方式
高性能数据存储有哪些方式
190 0
|
存储 缓存 移动开发
前端数据存储和缓存策略
前端数据存储和缓存策略
572 0
|
存储 SQL 缓存
MySQL 数据访问与查询优化:提升性能的实战策略和解耦优化技巧(二)
MySQL 数据访问与查询优化:提升性能的实战策略和解耦优化技巧(二)
144 0
|
存储 SQL 缓存
MySQL 数据访问与查询优化:提升性能的实战策略和解耦优化技巧(三)
MySQL 数据访问与查询优化:提升性能的实战策略和解耦优化技巧(三)
358 0
|
SQL 存储 缓存
MySQL 数据访问与查询优化:提升性能的实战策略和解耦优化技巧(一)
MySQL 数据访问与查询优化:提升性能的实战策略和解耦优化技巧
226 0
|
存储 SQL NoSQL
市面常见数据存储方式的简单介绍
下面是市面上一些存储方式概念的简单介绍,包含关系型数据库,非关系型数据库,内存数据库,数据仓库,对象存储,图数据库,时序数据库和多维数据库
1737 0
|
canal 缓存 负载均衡
应用多级缓存模式支撑海量数据的读操作
应用多级缓存模式支撑海量数据的读操作
268 0
应用多级缓存模式支撑海量数据的读操作
|
存储 机器学习/深度学习 人工智能
|
存储 前端开发 JavaScript