JAVA 数据访问

SQL连接

1.数据源自动配置

1)导入JDBC场景

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

spring-boot-starter-jdbc的包组成如下:

在这里插入图片描述
2)导入对应数据库驱动

        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.19</version>
      </dependency>

2.JDBC自动配置类分析

  • DataSourceAutoConfiguration:数据源自动配置,配置底层连接池
    • 修改数据源相关的配置:spring.datasource
    • 数据库连接池配置,当自动容器中没有DataSource时启用自动配置
    @Configuration
    @Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})
    @ConditionalOnMissingBean({DataSource.class, XADataSource.class}) //当容器中没有DataSource时启用
    @Import({Hikari.class, Tomcat.class, Dbcp2.class, Generic.class, DataSourceJmxConfiguration.class})
    protected static class PooledDataSourceConfiguration {
        protected PooledDataSourceConfiguration() {
        }
    }
    
  • DataSourceTransactionManagerAutoConfiguration:事务管理器自动配置
  • JdbcTemplateAutoConfiguration:JdbcTemplate自动配置,负责对数据库的操纵,对数据库进行curd
    • 可以通过修改@ConfigurationProperties( prefix = “spring.jdbc”)配置项,修改JdbcTemplate。
  • JndiDataSourceAutoConfiguration:jndi自动配置(JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个纪录,同时返回数据库连接建立所必须的信息)
  • XADataSourceAutoConfiguration:分布式数据库自动配置

3.修改配置项

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/study_notes?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false
    username: root
    password: 110120119
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

使用Druid数据源

1.引入Druid

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

2.创建自己的数据源配置文件
可以在数据源配置文件中配置是否开启druid监控、是否开启druid防火墙、监视web请求

@Configuration
public class MyDruidDataSourceConfig {

    @ConfigurationProperties("spring.datasource")
    @Bean
    public DataSource dataSource() throws SQLException {
        DruidDataSource druidDataSource = new DruidDataSource();
        //开启druid监控
        druidDataSource.setFilters("stat");
        //开启druid防火墙
        druidDataSource.setFilters("wall");
        return druidDataSource;
    }

    /**
     * 配置druid的监控页功能
     * @return
     */
    @Bean
    public ServletRegistrationBean statViewServlet(){
        StatViewServlet statViewServlet = new StatViewServlet();
        //设置拦截 将路由为druid的拦截
        ServletRegistrationBean<StatViewServlet> registrationBean=
                new ServletRegistrationBean<StatViewServlet>(statViewServlet,"/druid/*");
        //设置监控页登录密码
        registrationBean.addInitParameter("loginUserName","xixi");
        registrationBean.addInitParameter("loginPassword","123456");
        return registrationBean;
    }

    /**
     * 配置druid Web应用的监控
     * @return
     */
    @Bean
    public FilterRegistrationBean WebStatFilter(){
        WebStatFilter webStatFilter = new WebStatFilter();
        FilterRegistrationBean<WebStatFilter> webStatFilterFilterRegistrationBean =
                new FilterRegistrationBean<>(webStatFilter);
        webStatFilterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
        webStatFilterFilterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return webStatFilterFilterRegistrationBean;
    }

}

3.当然,除了手写配置外→_→,可以直接引入druid的starter哈哈哈,懵逼了吧,以上配置都会自动配置好

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
  • 扩展配置项spring.datasource.druid
spring:
  datasource:
    druid:
      enable: true
  • 分析DruidDataSourceAutoConfigure所引用的配置类@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
  • DruidSpringAopConfiguration.class:监控SpringBean,通过"spring.datasource.druid.aop-patterns"配置
 @ConditionalOnProperty({"spring.datasource.druid.aop-patterns"})
public class DruidSpringAopConfiguration {
 			....
}  
  • DruidStatViewServletConfiguration.class:配置监控页功能,通过配置项"spring.datasource.druid.stat-view-servlet"配置
  @ConditionalOnProperty(
    name = {"spring.datasource.druid.stat-view-servlet.enabled"},
    havingValue = "true"
)
public class DruidStatViewServletConfiguration {
    private static final String DEFAULT_ALLOW_IP = "127.0.0.1";

    public DruidStatViewServletConfiguration() {
    }
}
  • DruidWebStatFilterConfiguration.class:配置web监控,通过配置项"spring.datasource.druid.web-stat-filter"配置
  @ConditionalOnProperty(
    name = {"spring.datasource.druid.web-stat-filter.enabled"},
    havingValue = "true"
)
public class DruidWebStatFilterConfiguration {
		.....
}
  • DruidFilterConfiguration.class:设置druid所有Filter配置
public class DruidFilterConfiguration {
    private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.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";
    private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.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";
    private static final String FILTER_WALL_CONFIG_PREFIX = "spring.datasource.druid.filter.wall.config";

    public DruidFilterConfiguration() {
    }
}    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值