对于数据访问层,无论是 SQL
还是 NOSQL
,SpringBoot
默认采用整合 Spring Data
的方式进行统一的处理
添加大量自动配置,屏蔽了很多的设置。引入各种 xxxTemplate
、xxxRepository
来简化我们对数据访问层的操作。
对我们来说只需要进行简单的设置即可。
使用 Spring Initializr
模板创建一个新的 SpringBoot
工程
需要导入的模块中,勾选出 web
、mysql
、jdbc
模块
pom.xml
文件依赖如下
4.0.0
org.springframework.boot
spring-boot-starter-parent
1.5.21.RELEASE
com.jiker
springboot-sql
0.0.1-SNAPSHOT
springboot-sql
Demo project for Spring Boot
11
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
编写 application.yml
全局配置文件,配置数据源
spring:
datasource:
username: root
password: xxxxxxxx
url: jdbc:mysql://localhost:3306/test
效果:默认使用的是 org.apache.tomcat.jdbc.pool.DataSource
作为数据源
数据源的相关配置都是在 DataSourceProperties
中
测试如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootSqlApplicationTests {
@Autowired
DataSource dataSource;
@Test
public void contextLoads() throws SQLException {
System.out.println(dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
}
自动配置原理:
org.apache.tomcat.jdbc.pool.DataSource
:
1、参考 DataSourceConfiguration
,根据配置创建数据源,默认使用 Tomcat
连接池;
可以使用 spring.datasource.type
指定自定义的数据源类型
2、SpringBoot
默认可支持:
org.apache.tomcat.jdbc.pool.DataSource
HikariDataSource
BasicDataSource
3、自定义数据源类型
@Configuration
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(
name = {"spring.datasource.type"}
)
static class Generic {
Generic() {
}
@Bean
public DataSource dataSource(DataSourceProperties properties) {
//使用 DataSourceBuilder 创建数据源,利用反射创建响应 type 的数据源,并且绑定相关属性
return properties.initializeDataSourceBuilder().build();
}
}
4、DataSourceInitializer:ApplicationListener
作用:
默认只需将文件名命名为:
schema-*.sql、data-*.sql
默认规则:schema.sql ,schema-all.sql
可以使用:
schema:
- classpath:test.sql
指定位置
5、操作数据库:自动配置了 jdbcTemplate
操作数据库
测试:
package com.jiker.springbootsql.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
import java.util.Map;
@Controller
public class TestController {
@Autowired
JdbcTemplate jdbcTemplate;
@ResponseBody
@GetMapping("/query")
public Map map(){
List
导入 Druid
依赖
com.alibaba
druid
1.1.8
在 application.yml
配置文件中通过设置 spring.datasource.type
的值切换数据源
spring:
datasource:
username: root
password: joker61919980819
url: jdbc:mysql://localhost:3306/test
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
绑定属性
spring:
datasource:
username: root
password: joker61919980819
url: jdbc:mysql://localhost:3306/test
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
initiaSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictablIdleTimeMills: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
这些属性需要定义一个配置类进行属性赋值
package com.jiker.springbootsql.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 DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
}
配置 Druid
监控
package com.jiker.springbootsql.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
//配置Druid监控
//1.配置管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
Map initParams = new HashMap<>();
initParams.put("loginUsernaem","admin");
initParams.put("loginPassword","123456");
initParams.put("allow","")//默认允许所有访问
initParams.put("deny","192.168.15.21");
bean.setInitParameters(initParams);
return bean;
}
//2.配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
访问 /druid
请求
访问 /query
请求查询数据库
查看 Druid
的 SQL监控
Druid
配置数据源监控成功
时间:2019.6.10 19:12