Springboot数据访问(MySql版本)
1、导入并配置mysql
首先,我们新建个项目,并且导入我们需要的各种依赖。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springboot-mysql</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mysql</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--web场景-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--编译生效-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--自动生成setter、getter、构造器、toString-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--在配置文件自动补齐我们自定义类对象属性-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!--mysql驱动(如果是其他数据库就导入其他的驱动)-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<!--自动生成setter、getter、toString和构造器,无需添加到容器-->
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
<!--自动补齐我们自定义的类在yaml配置文件的属性名,无需添加到容器-->
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后我们配置我们的dataSource:(不配置的情况下,他默认的type,也就是数据源使用的是HikariDataSource对我们的数据进行增删改查操作)
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
username: root
password: root
这一段对应的数据库是:
2、自定义方式整合Druid数据源
导入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
然后我们看他默认给我们导入的数据源HikariDataSource:
matchIfMissing=true意思是:如果我们没有配置spring.datasource.type的话,那么就默认配置com.zaxxer.hikari.HikariDataSource为我们的数据源。
而这个数据源的导入呢,有两个前提,一个是要有HikariDataSource类,另一个是没有返回DataSource的Bean。
所以,我们要想把他替换掉,就是写一个返回DataSource的Bean就可以了。(说一下,DruidDataSource的爸爸DruidAbstractDataSource类实现了DataSource接口,因此,DruidDataSource也间接地实现了DataSource接口,算起来应该能算他的外孙吧。可以用多态的思想,让DataSource装一下他的外孙,返回DruidDataSource,能懂吧,相当于使用 DataSource source = new DruidDataSource();
)
来,我们写我们的配置类:
package com.example.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class MyDataSourceConfig {
/**
* @ConfigurationProperties 注解让这个Bean与配置文件进行绑定
* 具体绑定到前缀为spring.datasource下的属性
* 简单说,spring.datasource配了啥,他的setter就跟着配啥
*/
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}
}
我们可以写一个测试方法来测试一下:
package com.example.boot;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import javax.sql.DataSource;
@SpringBootTest
class SpringbootMysqlApplicationTests {
@Resource
DataSource dataSource;
@Test
void testDataSource(){
System.out.println("数据源的类型:"+dataSource.getClass());
}
}
运行结果:
配置Durid数据源,我们还可以开启他的监控页面,通过监控页面来开启我们的SQL监控、防火墙等等。具体可点击此处查看我对应的博客。
3、starer方式整合Druid数据源
前面那种方式,感觉可能不是特别好写,那有没有直接使用场景的方式呢?答案是肯定的。为了避免是前面小节配置的Druid数据源,首先我们把Druid的依赖删掉,并且将刚才的配置文件的注解@Configuration注释掉。
再然后,根据我们官方的指示,导入我们的druid场景。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
导入Druid场景后,我们看一下他的AutoConfigure类:
@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
解释一下:
- @AutoConfigureBefore({DataSourceAutoConfiguration.class}): 表示在DataSourceAutoConfiguration这个类配置前配置我们的DruidDataSourceAutoConfigure。(因为如果是DataSourceAutoConfiguration先配置的话,他会默认给我们配置Hikari数据源)
- @EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class}): 这两个Properties类,进去就可以看我们的默认配置信息啦。根据他的属性名,我们可以在yaml文件中直接对其进行修改,从而定制我们的Druid数据源
- @Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class}):
- DruidSpringAopConfiguration.class:开启Spring监控模块,yaml下配置属性名为:spring.datasource.druid.aop-patterns
- DruidStatViewServletConfiguration.class:开启监控页(默认开启)
- DruidWebStatFilterConfiguration.class:开启我们的webStat(默认开启)
- DruidFilterConfiguration.class:开启我们的拦截器
拦截器有以下这几种:
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";
现在,我们来演示一下怎么开启上面的监控页:
@ConditionalOnProperty(
name = {"spring.datasource.druid.stat-view-servlet.enabled"},
havingValue = "true"
)
public class DruidStatViewServletConfiguration {
DruidStatViewServletConfiguration告诉我们,得要配置了spring.datasource.druid.stat-view-servlet.enabled=true才行,ok,安排:
spring:
datasource:
#数据库连接池的信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
username: root
password: root
#开启监控页
druid:
filters: stat
stat-view-servlet:
enabled: true
如果我们还要配置监控页的登录账号密码,那么,我们搜一下源码:
在DruidStatProperties这个类下有一个子类StatViewServlet,而这个类下的loginUsername和loginPassword属性就是我们要设置的监控页账号密码。
如此,便用Properties类的前缀spring.datasource.druid加stat-view-servlet.login-username和stat-view-servlet.login-password来修改默认的值就可以了。如下:
spring:
datasource:
#数据库连接池的信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
username: root
password: root
druid:
stat-view-servlet:
#开启监控页
enabled: true
#配置账号密码
login-username: Keeling
login-password: 123456
顺便说下:
resetEnable是重置按钮,为false表示不要重置按钮。
allow是允许谁进行访问。
要开启我们的WebStatFilter呢,其实吧,他已经自动配好了:
@Bean
public FilterRegistrationBean webStatFilterRegistrationBean(DruidStatProperties properties) {
WebStatFilter config = properties.getWebStatFilter();
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
com.alibaba.druid.support.http.WebStatFilter filter = new com.alibaba.druid.support.http.WebStatFilter();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns(new String[]{config.getUrlPattern() != null ? config.getUrlPattern() : "/*"});
registrationBean.addInitParameter("exclusions", config.getExclusions() != null ? config.getExclusions() : "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
。。。。。。此处省略部分源码
}
- registrationBean.addUrlPatterns(new String[]{config.getUrlPattern() != null ? config.getUrlPattern() : “/*”}):这一句拦截了所有请求
- registrationBean.addInitParameter(“exclusions”, config.getExclusions() != null ? config.getExclusions() : “.js,.gif,.jpg,.png,.css,.ico,/druid/*”):这一句排除了对这些请求的拦截。
硬要配的话,也行:
他就在DuridStatProperties类的子类中
一样的,enabled是配置他开关,urlPattern是配置他拦截什么路径下的请求,exclusions是配置他不拦截哪些请求。
在yaml中再写一遍就是:
spring:
datasource:
#数据库连接池的信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
username: root
password: root
druid:
stat-view-servlet:
#开启监控页
enabled: true
#配置账号密码
login-username: Keeling
login-password: 123456
#配置web监控过滤
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
如果要开启Spring监控的话,那么就添加属性:(com.example.boot.* 是扫描的路径)
spring:
datasource:
druid:
aop-patterns: com.example.boot.*