06、数据访问
1、SQL
1、数据源的自动配置-HikariDataSource
1、导入JDBC场景
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
数据库驱动?
为什么导入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:
慢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