SpringBoot数据访问和自动配置原理
一、SpringBoot数据库访问
1、导入依赖
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5 <parent>
6 <groupId>org.springframework.boot</groupId>
7 <artifactId>spring-boot-starter-parent</artifactId>
8 <version>2.2.6.RELEASE</version>
9 <relativePath/> <!-- lookup parent from repository -->
10 </parent>
11 <groupId>com.lxy</groupId>
12 <artifactId>springboot-05-data</artifactId>
13 <version>0.0.1-SNAPSHOT</version>
14 <name>springboot-05-data</name>
15 <description>Demo project for Spring Boot</description>
16
17 <properties>
18 <java.version>1.8</java.version>
19 </properties>
20
21 <dependencies>
22
23 <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
24 <dependency>
25 <groupId>com.alibaba</groupId>
26 <artifactId>druid</artifactId>
27 <version>1.1.21</version>
28 </dependency>
29
30 <!--log4j-->
31 <dependency>
32 <groupId>log4j</groupId>
33 <artifactId>log4j</artifactId>
34 <version>1.2.17</version>
35 </dependency>
36
37 <!--web-->
38 <dependency>
39 <groupId>org.springframework.boot</groupId>
40 <artifactId>spring-boot-starter-web</artifactId>
41 </dependency>
42
43 <!--jdbc-->
44 <dependency>
45 <groupId>org.springframework.boot</groupId>
46 <artifactId>spring-boot-starter-jdbc</artifactId>
47 </dependency>
48
49 <!--mybatis-->
50 <dependency>
51 <groupId>org.mybatis.spring.boot</groupId>
52 <artifactId>mybatis-spring-boot-starter</artifactId>
53 <version>2.1.2</version>
54 </dependency>
55
56 <dependency>
57 <groupId>mysql</groupId>
58 <artifactId>mysql-connector-java</artifactId>
59 <scope>runtime</scope>
60 </dependency>
61 <dependency>
62 <groupId>org.springframework.boot</groupId>
63 <artifactId>spring-boot-starter-test</artifactId>
64 <scope>test</scope>
65 <exclusions>
66 <exclusion>
67 <groupId>org.junit.vintage</groupId>
68 <artifactId>junit-vintage-engine</artifactId>
69 </exclusion>
70 </exclusions>
71 </dependency>
72 </dependencies>
73
74 <build>
75 <plugins>
76 <plugin>
77 <groupId>org.springframework.boot</groupId>
78 <artifactId>spring-boot-maven-plugin</artifactId>
79 </plugin>
80 </plugins>
81 </build>
82
83 </project>
2、配置application.yml文件中关于数据源的参数
1 spring:
2 datasource:
3 username: root
4 password: mysql
5 url: jdbc:mysql://localhost:3306/mybatis?&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT%2B8&useSSL=false
6 driver-class-name: com.mysql.cj.jdbc.Driver
7 type: com.alibaba.druid.pool.DruidDataSource
8
9
10 #Spring Boot 默认是不注入这些属性值的,需要自己绑定
11 #druid 数据源专有配置
12 initialSize: 5
13 minIdle: 5
14 maxActive: 20
15 maxWait: 60000
16 timeBetweenEvictionRunsMillis: 60000
17 minEvictableIdleTimeMillis: 300000
18 validationQuery: SELECT 1 FROM DUAL
19 testWhileIdle: true
20 testOnBorrow: false
21 testOnReturn: false
22 poolPreparedStatements: true
23
24 #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
25 #如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
26 #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
27 filters: stat,wall,log4j
28 maxPoolPreparedStatementPerConnectionSize: 20
29 useGlobalDataSourceStat: true
30 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
二、自动配置原理
1、参考 DataSourceConfiguration 根据配置创建数据源。默认使用 HikariDataSource 数据源
2、SpringBoot默认还可以支持:org.apache.tomcat.jdbc.pool.DataSource.class、org.apache.commons.dbcp2.BasicDataSource.class数据源
3、自定义数据源类型
1 /**
2 * Generic DataSource configuration.
3 */
4 @Configuration(proxyBeanMethods = false)
5 @ConditionalOnMissingBean(DataSource.class)
6 @ConditionalOnProperty(name = "spring.datasource.type")
7 static class Generic {
8
9 @Bean
10 DataSource dataSource(DataSourceProperties properties) {
11 // 使用DataSourceBuilder创建数据源,利用反射创建相应type的数据源,并绑定相关属性
12 return properties.initializeDataSourceBuilder().build();
13 }
14 }
4、DataSourceInitiallizer:ApplicationListener
作用:在运行期间创建表
配置规则: 把相应的.sql文件放入resource/sql文件夹下即可
1 spring:
2 datasource:
3 initialization-mode: always
4 schema:
5 - classpath:sql/department.sql
6 - classpath:sql/employee.sql
三、配置Druid数据源
1、添加依赖
1 <!--druid -->
2 <dependency>
3 <groupId>com.alibaba</groupId>
4 <artifactId>druid</artifactId>
5 <version>1.1.21</version>
6 </dependency>
7
8 <!--log4j-->
9 <dependency>
10 <groupId>log4j</groupId>
11 <artifactId>log4j</artifactId>
12 <version>1.2.17</version>
13 </dependency>
2、在application.yml中配置druid参数 同上一、2
3、配置druidController
1 package com.lxy.config;
2
3 import com.alibaba.druid.pool.DruidDataSource;
4 import com.alibaba.druid.support.http.StatViewServlet;
5 import com.alibaba.druid.support.http.WebStatFilter;
6 import org.springframework.boot.context.properties.ConfigurationProperties;
7 import org.springframework.boot.web.servlet.FilterRegistrationBean;
8 import org.springframework.boot.web.servlet.ServletRegistrationBean;
9 import org.springframework.context.annotation.Bean;
10 import org.springframework.context.annotation.Configuration;
11
12
13 import javax.sql.DataSource;
14 import java.util.Arrays;
15 import java.util.HashMap;
16 import java.util.Map;
17
18 @Configuration
19 public class DruidConfig {
20 @ConfigurationProperties(prefix = "spring.datasource")
21 @Bean
22 public DataSource druid(){
23 return new DruidDataSource();
24 }
25 //配置Druid的监控
26 //1、配置一个管理后台的Servlet
27 @Bean
28 public ServletRegistrationBean statViewServlet(){
29 ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),
30 "/druid/*");
31 Map<String,String> initParams = new HashMap<>();
32 initParams.put("loginUsername","admin");
33 initParams.put("loginPassword","123456");
34 initParams.put("allow","");//默认就是允许所有访问
35 initParams.put("deny","192.168.15.21");
36 bean.setInitParameters(initParams);
37 return bean;
38 }
39
40 //2、配置一个web监控的filter
41 @Bean
42 public FilterRegistrationBean webStatFilter(){
43 FilterRegistrationBean bean = new FilterRegistrationBean();
44 bean.setFilter(new WebStatFilter());
45 Map<String,String> initParams = new HashMap<>();
46 initParams.put("exclusions","*.js,*.css,/druid/*");
47 bean.setInitParameters(initParams);
48 bean.setUrlPatterns(Arrays.asList("/*"));
49 return bean;
50 }
51 }