23.springboot與資料庫訪問
阿新 • • 發佈:2022-05-11
1.jdbc
快速建立springboot專案時,在sql場景裡選擇mysql和spring data jdbc分析自動配置pom檔案中: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 1.在配置檔案中(application.yml:配置對應的資料庫連線) spring: datasource: username: root password: 521521 url: jdbc:mysql://192.168.2.129:3306/jdbc driver-class-name: com.mysql.jdbc.Driver jdbc: template: query-timeout: 3 2.測試: @Autowired DataSource dataSource; @Test public void contextLoads() throws SQLException { System.out.println("載入驅動.."); System.out.println(dataSource.getClass()); System.out.println(dataSource.getConnection()); } 輸出: 載入驅動.. class com.zaxxer.hikari.HikariDataSource HikariProxyConnection@1406763631 wrapping com.mysql.cj.jdbc.ConnectionImpl@1e84f3c 結論:發現預設的資料來源是HikariDataSource,這裡需要注意的是springboot高版本使用的資料來源是HikariDataSource,低版本(2.0以前)預設使用的是org.apache.tomcat.jdbc.pool.DataSource springboot支援的DataSource有: 1.org.apache.tomcat.jdbc.pool.DataSource 2.HikariDataSource 3.BasicDataSource 4.自定義的資料來源型別 測試:使用JdbcTemplate來進行操作 @SpringBootTest @Slf4j class SpringBootDataJdbcApplicationTests { @Autowired JdbcTemplate jdbcTemplate; @Test public void contextLoads(){ log.info(":::"+jdbcTemplate.queryForObject("select age from person where id=1", String.class)); List<Person> personList = jdbcTemplate.query("select * from person", new BeanPropertyRowMapper<>(Person.class)); log.info("長度:"+personList.size()); for (Person person : personList) { log.info(":"+person.toString()); } } }
1.自動配置類
1.1:DataSourceAutoConfiguration(資料來源的自動配置類)
使用Druid作為資料來源
官方的參考地址:https://github.com/alibaba/druid 1.匯入druid的pom檔案 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.17</version> </dependency> 2.手動往容器中加入DataSource的元件 //重點1:標明當前類是springboot的配置類 @Configuration public class MyDataSourceConfig { //重點2:往容器中載入元件 @Bean //重點3:最重要的一點:將springboot配置檔案中的配置和加入元件的屬性進行繫結 @ConfigurationProperties("spring.datasource") public DataSource dataSource(){ DruidDataSource druidDataSource=new DruidDataSource(); return druidDataSource; } } 3.配置檔案中(application.yml)的寫法 spring: datasource: username: root password: 521521 url: jdbc:mysql://192.168.2.129:3306/jdbc driver-class-name: com.mysql.jdbc.Driver jdbc: template: query-timeout: 3 4.測試類: @SpringBootTest @Slf4j class SpringBootDataJdbcApplicationTests { @Autowired JdbcTemplate jdbcTemplate; @Autowired DataSource dataSource; @Test public void contextLoads(){ //重點1:此處輸出的是:資料來源型別:class com.alibaba.druid.pool.DruidDataSource(發現使用的是咱們自定義的資料來源) log.info("資料來源型別:{}",dataSource.getClass()); //重點2:此處的連線是通過自定義資料來源DruidDataSource取的連線進行資料庫查詢的 log.info(":::"+jdbcTemplate.queryForObject("select age from person where id=1", String.class)); List<Person> personList = jdbcTemplate.query("select * from person", new BeanPropertyRowMapper<>(Person.class)); log.info("長度:"+personList.size()); for (Person person : personList) { log.info(":"+person.toString()); } } }
使用Druid的內建監控頁
1.在上述基礎上,還得往容器中放入一個元件 @Configuration public class MyDataSourceConfig { @Bean @ConfigurationProperties("spring.datasource") public DataSource dataSource(){ DruidDataSource druidDataSource=new DruidDataSource(); return druidDataSource; } //重點1:加入自定義的servlet @Bean public ServletRegistrationBean statViewServlet(){ //重點2:加入StatViewServlet StatViewServlet statViewServlet=new StatViewServlet(); //重點3:加入statViewServlet處理/druid/*的所有請求 ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*"); return registrationBean; } } 啟動專案後,訪問http://localhost:8080/druid
監控頁的sql監控功能:
按照規範上設定,必須開啟Druid的監控統計功能
示例:
在上述基礎上
@Configuration
public class MyDataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource=new DruidDataSource();
//重點1:在上述基礎上設定資料來源的Filter屬性為stat:這樣即打開了sql統計功能
druidDataSource.setFilters("stat");
return druidDataSource;
}
@Bean
public ServletRegistrationBean statViewServlet(){
StatViewServlet statViewServlet=new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*");
return registrationBean;
}
}
2.測試:寫一個controller
@RestController
@Slf4j
public class DruidController {
@Autowired
JdbcTemplate jdbcTemplate;
@RequestMapping("/queryPerson")
public List<Person> queryPerosn(){
List<Person> personList =jdbcTemplate.query("select * from person", new BeanPropertyRowMapper<>(Person.class));
int num=jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
log.info("數量:"+num
);
for (Person person : personList) {
log.info(":"+person.toString());
}
return personList;
}
}
監控頁的web應用監控和URI監控
按照規範配置:
在上述基礎上加上webStatFilter的配置
@Configuration
public class MyDataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource=new DruidDataSource();
druidDataSource.setFilters("stat");
return druidDataSource;
}
@Bean
public ServletRegistrationBean statViewServlet(){
StatViewServlet statViewServlet=new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*");
return registrationBean;
}
//重點1:向容器中加入webStatFilter元件
@Bean
public FilterRegistrationBean webStatFilter(){
WebStatFilter webStatFilter=new WebStatFilter();
FilterRegistrationBean<WebStatFilter> filterFilterRegistrationBean=new FilterRegistrationBean<>(webStatFilter);
//重點2:設定filter的攔截路徑
filterFilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
//重點3:設定filter的過濾路徑,不加的話會攔截所有請求,包括靜態資源的請求等等
filterFilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterFilterRegistrationBean;
}
}
開啟sql防火牆
要點1:在資料來源配置中配置filter屬性,和sql監控開關stat同時使用時用逗號隔開
樣例如下:
在上述基礎上進行更改
...
@Bean
@ConfigurationProperties("spring.datasource")
//要點1:是在資料來源配置中進行配置
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource=new DruidDataSource();
//要點2:加上wall屬性:
//1.stat:sql監控開關
//2.wall:防火牆開關
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
....
第二種寫法:
1.因為資料來源和配置檔案中的spring.datasource進行了繫結,所以setFilte可以使用配置檔案完成
spring:
datasource:
username: root
password: 521521
url: jdbc:mysql://192.168.2.129:3306/jdbc
driver-class-name: com.mysql.jdbc.Driver
重點:在配置檔案中加上filters: stat,wall屬性
filters: stat,wall
jdbc:
template:
query-timeout: 3
2.在配置類中就可以去掉druidDataSource.setFilters("stat,wall");
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource=new DruidDataSource();
//去掉druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
裡面包含了各種檢查細節
設定監控頁面的訪問許可權(1.頁面的登入使用者名稱/密碼 2.訪問ip的限制)
示例如下:
在statViewServlet配置以下
...
@Bean
public ServletRegistrationBean statViewServlet(){
StatViewServlet statViewServlet=new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean=new ServletRegistrationBean<>(statViewServlet,"/druid/*");
//設定使用者密碼
registrationBean.addInitParameter("loginUsername","admin");
registrationBean.addInitParameter("loginPassword","521521");
//設定登入頁面的黑白名單
registrationBean.addInitParameter("allow","192.168.0.107");
registrationBean.addInitParameter("deny", "192.168.0.10");
return registrationBean;
}
...
使用stater去操作durid
步驟
1.引入stater
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
DruidDataSourceAutoConfigure(Druid資料來源自動配置類中自動注入了以下的類)
各有什麼作用呢
1.DruidSpringAopConfiguration:(監控的是springbean的)-->配置項是spring.datasource.druid.aop-patterns
2.DruidStatViewServletConfiguration:監控頁的配置:spring.datasource.druid.stat-view-servlet預設是開啟:(詳解,主要配置的是sql監控頁的登入賬號和密碼,以及允許登入的ip和不允許登入的ip)
3.DruidWebStatFilterConfiguration:web監控的配置:spring.datasource.druid.web-stat-filter預設是開啟
4.DruidFilterConfiguration:所有Druid自己filter的配置
1.DruidSpringAopConfiguration說明:(監控的是springbean的)-->配置項是spring.datasource.druid.aop-patterns
詳細程式碼如下:
@ConditionalOnProperty({"spring.datasource.druid.aop-patterns"})
public class DruidSpringAopConfiguration {
public DruidSpringAopConfiguration() {
}
...
}
在application.yaml中配置示例如下:
spring:
datasource:
username: root
password: 521521
url: jdbc:mysql://192.168.2.129:3306/jdbc
driver-class-name: com.mysql.jdbc.Driver
重點1:會監控com.wmd包下的元件資訊
druid:
aop-patterns: com.wmd
2.DruidStatViewServletConfiguration監控頁的配置:spring.datasource.druid.stat-view-servlet預設是開啟
詳解,主要配置的是sql監控頁的登入賬號和密碼,以及允許登入的ip和不允許登入的ip
使用示例:
spring:
datasource:
username: root
password: 521521
url: jdbc:mysql://192.168.2.129:3306/jdbc
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: com.wmd
重點1
stat-view-servlet:
//是否使用:預設是true
enabled: true
//sql監控頁的登入使用者名稱和密碼
login-username: admin
login-password: 521521
//sql頁登入的白名單和黑名單
allow: 192.168.0.107
deny: 192.168.0.10
3.DruidWebStatFilterConfiguration:web監控的配置:spring.datasource.druid.web-stat-filter,預設是開啟
詳解:頁面上web監控的配置選項,監控各路徑訪問次數以及相關資訊
使用樣例如下:
spring:
datasource:
username: root
password: 521521
url: jdbc:mysql://192.168.2.129:3306/jdbc
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: com.wmd
stat-view-servlet:
enabled: true
login-username: admin
login-password: 521521
allow: 192.168.0.107
deny: 192.168.0.10
重點1:
web-stat-filter:
//是否開啟:預設是true
enabled: true
//監控的路徑:監控所有路徑
url-pattern: /*
//不監控哪些路徑
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
4.DruidFilterConfiguration:所有Durid中filter的自己的配置
詳情:可以配置以下的多種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";
...
}
使用樣例:
spring:
datasource:
username: root
password: 521521
url: jdbc:mysql://192.168.2.129:3306/jdbc
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: com.wmd
stat-view-servlet:
enabled: true
login-username: admin
login-password: 521521
allow: 192.168.0.107
deny: 192.168.0.10
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
重點:1
使用的filter
filters: stat,wall,slf4j
使用的filter具體的配置:具體的配置可以參考:https://github.com/alibaba/druid
filter:
stat:
log-slow-sql: true
slow-sql-millis: 1000
enabled: true
wall:
enabled: true
config:
drop-table-allow: false