Spring Boot中數(shù)據(jù)庫操作Druid和HikariDataSource的詳細(xì)過程
Spring Boot 數(shù)據(jù)庫操作
JDBC+HikariDataSource
應(yīng)用實(shí)例-需求
● 需求:演示Spring Boot 如何通過jdbc+HikariDataSource 完成對Mysql 操作
說明: HikariDataSource : 目前市面上非常優(yōu)秀的數(shù)據(jù)源, 是springboot2 默認(rèn)數(shù)據(jù)源
創(chuàng)建測試數(shù)據(jù)庫和表
-- 創(chuàng)建furns_ssm DROP DATABASE IF EXISTS spring_boot; CREATE DATABASE spring_boot; USE spring_boot; -- 創(chuàng)建家居表 CREATE TABLE furn( `id` INT(11) PRIMARY KEY AUTO_INCREMENT, ## id `name` VARCHAR(64) NOT NULL, ## 家居名 `maker` VARCHAR(64) NOT NULL, ## 廠商 `price` DECIMAL(11,2) NOT NULL, ## 價(jià)格 `sales` INT(11) NOT NULL, ## 銷量 `stock` INT(11) NOT NULL, ## 庫存 `img_path` VARCHAR(256) NOT NULL ## 照片路徑 ); -- 初始化家居數(shù)據(jù) INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 北歐風(fēng)格小桌子' , ' 熊貓家居' , 180 , 666 , 7 , 'assets/images/product-image/1.jpg'); INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 簡約風(fēng)格小椅子' , ' 熊貓家居' , 180 , 666 , 7 , 'assets/images/product-image/2.jpg'); INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 典雅風(fēng)格小臺燈' , ' 螞蟻家居' , 180 , 666 , 7 , 'assets/images/product-image/3.jpg'); INSERT INTO furn(`id` , `name` , `maker` , `price` , `sales` , `stock` , `img_path`) VALUES(NULL , ' 溫馨風(fēng)格盆景架' , ' 螞蟻家居' , 180 , 666 , 7 , 'assets/images/product-image/4.jpg'); SELECT * FROM furn;
進(jìn)行數(shù)據(jù)庫開發(fā), 在pom.xml 引入data-jdbc starter 參考官方文檔
https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-syst
ems.starters .
<!--進(jìn)行數(shù)據(jù)庫開發(fā),引入data-jdbc starter--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
需要在pom.xml 指定導(dǎo)入數(shù)據(jù)庫驅(qū)動(dòng)
因?yàn)镾pring Boot 不知道項(xiàng)目要操作Mysql 還是Oracle , 需要在pom.xml 指定導(dǎo)入數(shù)據(jù)庫驅(qū)動(dòng), 并指定對應(yīng)版本.
<!--引入mysql的驅(qū)動(dòng) 1. 說明這里沒有使用版本仲裁 <mysql.version>8.0.26</mysql.version> 2. 指定的版本是5.1.49 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency>
在application.yml 配置操作數(shù)據(jù)源的信息
spring: servlet: multipart: max-file-size: 10MB max-request-size: 50MB datasource: #配置數(shù)據(jù)源 # 說明: 如果你沒有指定useSSL=true ,啟動(dòng)項(xiàng)目會報(bào)紅警告, 環(huán)境的問題,要靈活處理 url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8 username: root password: 自己的密碼 driver-class-name: com.mysql.jdbc.Driver
創(chuàng)建bean\Furn.java
public class Furn { private Integer id; private String name; private String maker; private BigDecimal price; private Integer sales; private Integer stock; private String imgPath = "assets/images/product-image/1.jpg"; public Furn(Integer id, String name, String maker, BigDecimal price, Integer sales, Integer stock, String imgPath) { this.id = id; this.name = name; this.maker = maker; this.price = price; this.sales = sales; this.stock = stock; this.imgPath = imgPath; } public Furn() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMaker() { return maker; } public void setMaker(String maker) { this.maker = maker; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public Integer getSales() { return sales; } public void setSales(Integer sales) { this.sales = sales; } public Integer getStock() { return stock; } public void setStock(Integer stock) { this.stock = stock; } public String getImgPath() { return imgPath; } public void setImgPath(String imgPath) { this.imgPath = imgPath; } @Override public String toString() { return "Furn{" + "id=" + id + ", name='" + name + '\'' + ", maker='" + maker + '\'' + ", price=" + price + ", sales=" + sales + ", stock=" + stock + ", imgPath='" + imgPath + '\'' + '}'; } }
測試結(jié)果
test 目錄下的usersys/ApplicationTests.java , 完成測試
如果不知道JdbcTemplate請看一下spring的博客文章
使用BeanPropertyRowMapper時(shí),是給query()方法傳遞一個(gè)BeanPropertyRowMapper對象讓JdbcTemplate幫我們把執(zhí)行sql語句的結(jié)果集自動(dòng)幫我們封裝到對應(yīng)的屬性
@SpringBootTest public class ApplicationTests { //如果不知道JdbcTemplate請看一下spring的博客文章 @Resource private JdbcTemplate jdbcTemplate; @Test public void contextLoads() { BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class); List<Furn> furns = jdbcTemplate.query("SELECT * FROM `furn`", rowMapper); for (Furn furn : furns) { System.out.println(furn); } System.out.println(jdbcTemplate.getDataSource().getClass()); } }
整合Druid 到Spring-Boot
官方文檔
使用手冊: https://github.com/alibaba/druid
中文手冊: https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
基本介紹
1. HiKariCP: 目前市面上非常優(yōu)秀的數(shù)據(jù)源, 是springboot2 默認(rèn)數(shù)據(jù)源
2. Druid: 性能優(yōu)秀,Druid 提供性能卓越的連接池功能外 這個(gè)在專題javaEE的數(shù)據(jù)庫和jdbc的這篇博客中有說明 鏈接
,還集成了SQL 監(jiān)控,黑名單攔截等功能,強(qiáng)大的監(jiān)控特性,通過Druid 提供的監(jiān)控功能,可以清楚知道連接池和SQL 的工作情況,所以根據(jù)項(xiàng)目需要,我們也要掌握Druid 和SpringBoot 整合
3. 整合Druid 到Spring-Boot 方式
● 自定義方式
● 引入starter 方式
Durid 基本使用
需求: 將Spring-Boot 的數(shù)據(jù)源切換成Druid
修改pom.xml , 引入druid 依賴
<!--引入druid starter--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency>
創(chuàng)建DruidDataSourceConfig.java 配置類
@Configuration public class DruidDataSourceConfig { //編寫方法,注入DruidDataSource //還有說明一下為什么我們注入自己的DataSource , 默認(rèn)的HiKariDatasource失效? //1. 默認(rèn)的數(shù)據(jù)源是如配置? @ConditionalOnMissingBean({ DataSource.class, XADataSource.class }) // 解讀通過@ConditionalOnMissingBean({ DataSource.class}) 判斷如果容器有DataSource Bean 就不注入默認(rèn)的HiKariDatasource @ConfigurationProperties("spring.datasource") @Bean public DataSource dataSource() throws SQLException { //1. 配置了 @ConfigurationProperties("spring.datasource") // 就可以讀取到application.yml的配置 //2. 我們就不需要調(diào)用DruidDataSource 對象的setXxx, 會自動(dòng)關(guān)聯(lián) DruidDataSource druidDataSource = new DruidDataSource(); return druidDataSource; } }
完成測試,運(yùn)行ApplicationTests.java , 觀察數(shù)據(jù)源的運(yùn)行類型
Durid 監(jiān)控功能-SQL 監(jiān)控
需求: 配置Druid 的監(jiān)控功能,包括SQL 監(jiān)控、SQL 防火墻、Web 應(yīng)用、Session 監(jiān)控等
修改DruidDataSourceConfig.java , 增加druid 監(jiān)控功能
地址:
https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
//配置druid的監(jiān)控頁功能 @Bean public ServletRegistrationBean statViewServlet() { //創(chuàng)建StatViewServlet StatViewServlet statViewServlet = new StatViewServlet(); ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*"); //設(shè)置init-parameter, 設(shè)置用戶名和密碼 registrationBean.addInitParameter("loginUsername", "wyx"); registrationBean.addInitParameter("loginPassword", "666666"); return registrationBean; }
完成測試
訪問http://localhost:10000/druid/index.html 不會被攔截, 如果沒有問題,會看到這個(gè)頁面
修改DruidDataSourceConfig.java , 加入監(jiān)控功能
參考: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
創(chuàng)建DruidSqlController.java
@Controller public class DruidSqlController { @Resource private JdbcTemplate jdbcTemplate; @ResponseBody @GetMapping("/sql") public List<Furn> crudDB() { BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class); List<Furn> furns = jdbcTemplate.query("select * from `furn`", rowMapper); for (Furn furn : furns) { System.out.println(furn); } return furns; } }
SQL 監(jiān)控?cái)?shù)據(jù)-測試頁面
● 完成測試, 觀察SQL 監(jiān)控?cái)?shù)據(jù), 瀏覽器http://localhost:10000/druid/sql.html
Durid 監(jiān)控功能-Web 關(guān)聯(lián)監(jiān)控
需求: 配置Web 關(guān)聯(lián)監(jiān)控配置:Web 應(yīng)用、URI 監(jiān)控
官方文檔
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
Web 關(guān)聯(lián)監(jiān)控配置-Web 應(yīng)用、URI 監(jiān)控
DruidDataSourceConfig.java , 注入/ 增加WebStatFilter 用于采集web-jdbc 關(guān)聯(lián)監(jiān)控的數(shù)據(jù)
//配置WebStatFilter, 用于采集web-jdbc關(guān)聯(lián)的監(jiān)控?cái)?shù)據(jù) @Bean public FilterRegistrationBean webStatFilter() { //創(chuàng)建 WebStatFilter WebStatFilter webStatFilter = new WebStatFilter(); FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter); //默認(rèn)對所有的url請求進(jìn)行監(jiān)控 filterRegistrationBean.setUrlPatterns(Arrays.asList("/*")); //排除指定的url filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; }
為了測試方便,修改/WebConfig.java, 放行/sql 請求
重啟項(xiàng)目,看看Web 應(yīng)用和URI 監(jiān)控頁面
完成測試,重啟項(xiàng)目,看看Web 應(yīng)用和URI 監(jiān)控是否生效
Durid 監(jiān)控功能-SQL 防火墻
需求: 配置SQL 防火墻
官方文檔https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
修改DruidDataSourceConfig.java ,加入防火墻監(jiān)控
@ConfigurationProperties("spring.datasource") @Bean public DataSource dataSource() throws SQLException { //1. 配置了 @ConfigurationProperties("spring.datasource") // 就可以讀取到application.yml的配置 //2. 我們就不需要調(diào)用DruidDataSource 對象的setXxx, 會自動(dòng)關(guān)聯(lián) DruidDataSource druidDataSource = new DruidDataSource(); //加入監(jiān)控功能, 加入了sql防火墻監(jiān)控 druidDataSource.setFilters("stat,wall"); return druidDataSource; }
完成測試,重啟項(xiàng)目,看看SQL 防火墻監(jiān)控是否生效
Durid 監(jiān)控功能-Session 監(jiān)控
需求: 配置Session 監(jiān)控
官方文檔https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
Session 監(jiān)控
重啟項(xiàng)目, 先登錄管理系統(tǒng)
完成測試, 查看監(jiān)控頁需要輸入用戶名和密碼, 點(diǎn)擊Session 監(jiān)控,可以看到相關(guān)信息
(注意要登錄用戶系統(tǒng),才能看到Session 監(jiān)控信息)
Druid Spring Boot Starter 基本介紹
1. 前面我們使用的是自己引入druid+配置類方式整合Druid 和監(jiān)控
2. Druid Spring Boot Starter 可以讓程序員在Spring Boot 項(xiàng)目中更加輕松集成Druid 和監(jiān)控
修改pom.xml 注銷druid 的依賴
注銷DruidDataSourceConfig.java
這時(shí)測試,druid 失效
查看druid 文檔https://github.com/alibaba/druid,引入druid starter
確認(rèn)druid starter 引入哪些依賴
修改resources/application.yml 增加配置參數(shù)
spring: servlet: multipart: max-file-size: 10MB max-request-size: 50MB datasource: #配置數(shù)據(jù)源 # 說明: 如果你沒有指定useSSL=true ,啟動(dòng)項(xiàng)目會報(bào)紅警告, 環(huán)境的問題,靈活處理 url: jdbc:mysql://localhost:3306/spring_boot?useSSL=true&useUnicode=true&characterEncoding=UTF-8 username: root password: 自己的密碼 driver-class-name: com.mysql.jdbc.Driver #配置druid和監(jiān)控功能 druid: stat-view-servlet: enabled: true login-username: jack login-password: 666 reset-enable: false web-stat-filter: #配置web監(jiān)控 enabled: true url-pattern: /* exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' filter: stat: #sql監(jiān)控 slow-sql-millis: 1000 log-slow-sql: true enabled: true wall: #配置sql防火墻 enabled: true config: drop-table-allow: false select-all-column-allow: false
重啟項(xiàng)目,完成測試
測試完成后,記得改回成原來的代碼.(個(gè)人習(xí)慣) ...
到此這篇關(guān)于Spring Boot中數(shù)據(jù)庫操作Druid和HikariDataSource的文章就介紹到這了,更多相關(guān)Spring Boot Druid和HikariDataSource內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決idea使用過程中讓你覺得不爽的一些問題(小結(jié))
這篇文章主要介紹了解決idea使用過程中讓你覺得不爽的一些問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Centos 7 安裝 OpenJDK 11 兩種方式及問題小結(jié)
這篇文章主要介紹了Centos 7 安裝 OpenJDK 11 兩種方式,第一種方式使用yum安裝,第二種方式使用tar解壓安裝,每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09java線程池不同場景下使用示例經(jīng)驗(yàn)總結(jié)
這篇文章主要為大家介紹了java線程池不同場景如何使用的示例源碼及經(jīng)驗(yàn)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03淺析Java如何優(yōu)雅的設(shè)計(jì)接口狀態(tài)碼和異常
HTTP協(xié)議里定義了一系列的狀態(tài)碼用來表明請求的狀態(tài),如常用的200表示請求正常,404表示請求的資源不存在,所以本文就來和大家討論一下如何優(yōu)雅的設(shè)計(jì)接口狀態(tài)碼和異常,感興趣的可以了解下2024-03-03淺談利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問題
本篇文章主要介紹了淺談利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問題,具有一定的參考價(jià)值,有需要的可以了解一下2017-08-08SpringBoot解決Required?String?parameter?xxx?is?not?prese
這篇文章主要介紹了SpringBoot解決Required?String?parameter?xxx?is?not?present問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01淺談java反射和自定義注解的綜合應(yīng)用實(shí)例
本篇文章主要介紹了java反射和自定義注解的綜合應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09