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() {
}
}