SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)
1.SpringBoot整合Druid
Druid是阿里巴巴的一個開源專案,是一個資料庫連接池的實作,結合了C3P0、DBCP、PROXOOL等DB池的優點,整合配置參考地址,Druid不但提供連接池的功能,還提供監控功能,可以實時查看資料庫連接池和SQL查詢的作業情況(最牛X的地方就在與提供的日志監控功能),在上一章中(SpringBoot整合JDBC,JPA)講述到,Spring Boot底層都是采用Spring Data的方式進行統一處理,Spring Data中內置連接池資料源HikariDataSource,SpringBoot整合Druid實作資料源更換,則需要手動配置,
1.新建SpringBoot工程,引入依賴
基礎依賴:新建SpringBoot工程,建議引入以下基礎依賴
spring-boot-starter-parent(SpringBoot父工程)——必選
spring-boot-starter(SpringBoot啟動器)——必選
spring-boot-devtools(SpringBoot熱部署)——可選
spring-boot-starter-web(SpringBoot整合WEB)——必選
mysql-connector-java(MySQL驅動)——必選
druid-spring-boot-starter(SpringBoot整合Druid)——必選
spring-boot-starter-jdbc(SpringBoot整合JDBC)——必選
spring-boot-starter-test(SpringBoot整合測驗Junit)——默認必選
spring-boot-maven-plugin(SpringBoot打包插件)——必選
lombok(整合Lombok簡化POJO開發)——可選
spring-boot-configuration-processor(SpringBoot整合組態檔注入POJO)——可選
1 <!-- MySQL驅動 --> 2 <dependency> 3 <groupId>mysql</groupId> 4 <artifactId>mysql-connector-java</artifactId> 5 <scope>runtime</scope> 6 </dependency> 7 8 <!-- SpringBoot整合Druid --> 9 <dependency> 10 <groupId>com.alibaba</groupId> 11 <artifactId>druid-spring-boot-starter</artifactId> 12 <version>1.1.22</version> 13 </dependency>
常見問題:整合如果沒有引入spring-boot-starter-jdbc,會報錯:.....ClassNotFoundException: org....jdbc....embedded.EmbeddedDatabaseType,
問題原因:Spring Boot底層都是采用Spring Data的方式進行統一處理,EmbeddedDatabaseType類在spring-boot-starter-jdbc依賴中,
依賴說明:SpringBoot屬于Spring“全家桶”組件,Druid屬于阿里巴巴旗下開發產品,所以SpringBoot整合Druid并不是由Spring組件提供依賴,而是由阿里巴巴提供,
2.修改yml組態檔,整合配置Druid
1 spring: 2 datasource: 3 # 資料庫訪問配置, 使用druid資料源(默認資料源是HikariDataSource) 4 type: com.alibaba.druid.pool.DruidDataSource 5 #鏈接池配置 6 druid: 7 driver-class-name: com.mysql.cj.jdbc.Driver 8 url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8 9 username: root 10 password: xsge 11 12 # 連接池配置:大小,最小,最大 13 initial-size: 5 14 min-idle: 5 15 max-active: 20 16 17 # 連接等待超時時間 18 max-wait: 30000 19 20 # 配置檢測可以關閉的空閑連接,間隔時間 21 time-between-eviction-runs-millis: 60000 22 23 # 配置連接在池中的最小生存時間 24 min-evictable-idle-time-millis: 300000 25 # 檢測連接是否有,有效得select陳述句 26 validation-query: select '1' from dual 27 # 申請連接的時候檢測,如果空閑時間大于time-between-eviction-runs-millis,執行validationQuery檢測連接是否有效,建議配置為true,不影響性能,并且保證安全性, 28 test-while-idle: true 29 # 申請連接時執行validationQuery檢測連接是否有效,建議設定為false,不然會會降低性能 30 test-on-borrow: false 31 # 歸還連接時執行validationQuery檢測連接是否有效,建議設定為false,不然會會降低性能 32 test-on-return: false 33 34 # 是否快取preparedStatement,也就是PSCache 官方建議MySQL下建議關閉 個人建議如果想用SQL防火墻 建議打開 35 # 打開PSCache,并且指定每個連接上PSCache的大小 36 pool-prepared-statements: true 37 max-open-prepared-statements: 20 38 max-pool-prepared-statement-per-connection-size: 20 39 40 # 配置監控統計攔截的filters, 去掉后監控界面sql無法統計, 'wall'用于防火墻防御sql注入,stat監控統計,logback日志 41 filters: stat,wall 42 # Spring監控AOP切入點,如x.y.z.service.*,配置多個英文逗號分隔 43 #aop-patterns: com.springboot.servie.* 44 # lowSqlMillis用來配置SQL慢的標準,執行時間超過slowSqlMillis的就是慢 45 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 46 47 # WebStatFilter監控配置 48 web-stat-filter: 49 enabled: true 50 # 添加過濾規則:那些訪問攔截統計 51 url-pattern: /* 52 # 忽略過濾的格式:哪些不攔截,不統計 53 exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' 54 55 # StatViewServlet配置(Druid監控后臺的Servlet映射配置,因為SpringBoot專案沒有web.xml所在在這里使用組態檔設定) 56 stat-view-servlet: 57 enabled: true 58 # 配置Servlet的訪問路徑:訪問路徑為/druid/**時,跳轉到StatViewServlet,會自動轉到Druid監控后臺 59 url-pattern: /druid/* 60 # 是否能夠重置資料 61 reset-enable: false 62 # 設定監控后臺的訪問賬戶及密碼 63 login-username: xsge 64 login-password: xsge 65 # IP白名單:允許哪些主機訪問,默認為“”任何主機 66 # allow: 127.0.0.1 67 # IP黑名單:禁止IP訪問,(共同存在時,deny優先于allow) 68 # deny: 192.168.1.218 69 70 # 配置StatFilter 71 filter: 72 stat: 73 log-slow-sql: true
上述配置不但配置了Druid作為連接池,而且還開啟了Druid的監控功能, 其他配置可參考官方網站,
3.啟動專案運行測驗
啟動SpringBoot主程式,啟動后訪問:http://localhost:8080/druid 會自動跳轉至Druid后臺監控登錄頁,輸入自定義配置的賬戶/密碼(xsge,xsge)即可登錄查看詳情,
更多Druid問題需求說明,請參照Druid官網常見問題,
2.SpringBoot整合MyBatis
1.概述
實際專案中,在對資料庫訪問層對資料庫進行操作時,大部分時候我們都用的MyBatis/Hibernate,所以SpringBoot整合MyBatis怎么說也算是必修課了!!!
2.準備作業
- 創建資料庫,

- 新增對應資料庫物體類,
@Data @AllArgsConstructor @NoArgsConstructor public class Person { private Integer id; private String name; private String password; }
-
修改pom.xml引入依賴,
以下依賴檔案,并非整個專案中所有已包含的依賴,例如:熱部署,Lombok等,由于代碼長度問題,一些基本參考的依賴,我并沒有寫入,請另行參考博主其他SpringBoot整合檔案,自行參考匯入更多所需依賴,
Spring家族的使命就是為了簡化而生,但是隨著Spring的發展壯大,有點事與愿違了,為了堅持初心,Spring家族祭出了一大殺器---Spring Boot,Spring Boot的核心理念是:不建議使用xml檔案配置,但是,這對MyBatis來說進退兩難,因為MyBatis離不開xml,需要xml來配置sql陳述句,為了迎合Spring Boot的發展理念,MyBatis官方開發了mybatis-spring-boot-starter1 <!-- MySQL驅動 --> 2 <dependency> 3 <groupId>mysql</groupId> 4 <artifactId>mysql-connector-java</artifactId> 5 <scope>runtime</scope> 6 </dependency> 7 <!-- SpringBoot整合MyBatis --> 8 <dependency> 9 <groupId>org.mybatis.spring.boot</groupId> 10 <artifactId>mybatis-spring-boot-starter</artifactId> 11 <version>2.0.1</version> 12 </dependency> 13 <!-- SpringBoot整合druid-spring-boot-starter --> 14 <dependency> 15 <groupId>com.alibaba</groupId> 16 <artifactId>druid-spring-boot-starter</artifactId> 17 <version>1.1.22</version> 18 </dependency> 19 <!-- SpringBoot整合JDBC --> 20 <dependency> 21 <groupId>org.springframework.boot</groupId> 22 <artifactId>spring-boot-starter-jdbc</artifactId> 23 </dependency>
注意:SpringBoot引入MySQL驅動默認版本為8.x,可以手動配置版本,
依賴說明:MyBatis屬于獨立框架,不屬于Sprng組件,因此SpringBoot整合MyBatis的依賴由MyBatis提供,MyBatis整合SpringBoot的依賴版本,參考mybatis-spring-boot-starter官方說明檔案
- 創建一個包含基本CRUD的PersonMapper
1 public interface PersonMapper { 2 int add(Person person);// 添加 3 int update(Person person);// 修改 4 int deleteById(Integer id);// 洗掉 5 Person queryPersonById(Integer id);// 查詢一個 6 Person queryListPerson();// 查詢所有 7 }
3.SpringBoot整合MyBatis實作CURD
整合MyBatis實作CURD,Mapper介面可以基于注解方式或XML方式,注解方式:代碼更加精簡,方便,XML配置方式:隔離sql和業務代碼,清晰表達sql,尤其對于較長的sql而言,(Spring Boot不建議使用XML檔案配置)
1.Mapper介面基于注解方式實作CURD
- 修改Mapper介面,添加SQL注解
此處僅列舉兩個案例,如需學習更多SQL注解,請關注博主MyBatis文章,
1 public interface PersonMapper { 2 @Insert("INSERT INTO person(name,password) values(#{name},#{password})") 3 int add(Person person);// 添加 4 @Select("SELECT * FROM person WHERE id=#{id}") 5 Person queryPersonById(Integer id);// 查詢一個 6 7 // 下面的兩個將用于練習基于XML組態檔方式 8 int update(Person person);// 修改 9 List<Person> queryListPerson();// 查詢所有 10 }
- 新增Service介面
1 public interface PersonService { 2 int add(Person person);// 添加 3 Person queryPersonById(Integer id);// 查詢一個 4 5 int update(Person person);// 修改 6 List<Person> queryListPerson();// 查詢所有 7 }
- 新增Service實作
1 @Service 2 public class PersonServiceImpl implements PersonService{ 3 4 @Autowired // 注入DAO層Mapper 5 private PersonMapper personMapper; 6 7 @Override 8 public int add(Person person) { 9 return personMapper.add(person); 10 } 11 12 @Override 13 public Person queryPersonById(Integer id) { 14 return personMapper.queryPersonById(id); 15 } 16 17 @Override 18 public int update(Person person) { 19 return personMapper.update(person); 20 } 21 22 @Override 23 public List<Person> queryListPerson() { 24 return personMapper.queryListPerson(); 25 } 26 27 }
- 新增控制器PersonController
1 @RestController 2 public class PersonController { 3 4 @Autowired 5 private PersonService personService; 6 /** 7 * 測驗介面:http://localhost:8080/queryPersonById/1 8 * 請求方式:get 入參:查詢id 回傳值:查詢的一行資料Person(JSON格式) 9 */ 10 @GetMapping("/queryPersonById/{id}") 11 public Person queryPersonById(@PathVariable Integer id) { 12 return personService.queryPersonById(id); 13 } 14 15 /** 16 * 測驗介面:http://localhost:8080/addPerson 17 * 請求方式:put 入參:JSON資料 回傳值:添加成功影響行數 18 */ 19 @RequestMapping(value = "https://www.cnblogs.com/addPerson",method = RequestMethod.PUT) 20 public int addPerson(@RequestBody Person person) { 21 return personService.add(person); 22 } 23 24 }
- 建議修改yml檔案,添加別名和駝峰命名配置
- 在啟動類上添加注解@MapperScan(...)
默認情況下,MyBatis-Spring-Boot-Starter會查找以@Mapper注解標記的映射器,你需要給每個MyBatis映射器標識上@Mapper注解,但是這樣非常的麻煩,這時可以使用@MapperScan注解來掃描包,@MapperScan注解的作用:指定要變成實作類的介面所在的包,包下面的所有介面在編譯之后都會代理生成相應的實作類,添加位置:是在Springboot啟動類上面添加,
@SpringBootApplication 2 @MapperScan("com.xsge.app.mapper") 3 public class SpringbootMybatisApplication { 4 5 public static void main(String[] args) { 6 SpringApplication.run(SpringbootMybatisApplication.class, args); 7 } 8 9 }
除了在啟動類上使用注解@MapperScan實作掃描Mapper介面生成代理物件外,還可以使用@Mapper注解,介面類上添加了@Mapper,在編譯之后也會生成相應的介面實作類,兩者選擇其一即可,但使用@Mapper則要求每個介面類上都需要添加,通過使用@MapperScan注解,可以讓我們不用為每個Mapper類都添加@Mapper注解,詳情參考MyBatis中文網
- 運行SpringBoot啟動類測驗

2.Mapper介面基于XML方式實作CURD
使用xml方式需要在application.yml中進行一些額外的配置,(通常即使在注解方式中,也會添加公共的配置)
- 修改yml檔案,新增配置
1 # MyBatis配置 2 mybatis: 3 # 配置別名 4 type-aliases-package: com.xsge.app.entity 5 # 配置XML掃描地址 6 mapper-locations: 7 - classpath:mapper/*.xml 8 # 配置啟用駝峰命名方式 9 configuration: 10 map-underscore-to-camel-case: true 11 # 設定日志顯示:在控制臺列印SQL 12 logging: 13 level: 14 # 以包名前置,表示指定包下的操作指定日志級別, 15 com.xsge.app.mapper: DEBUG
- 在根目錄下增子mapper包,并添加mapper映射配置(xml檔案)
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 3 4 <mapper namespace= "com.xsge.app.mapper.PersonMapper"> 5 6 <update id="update" parameterType="com.xsge.app.entity.Person"> 7 UPDATE person SET name=#{name},password=#{password} WHERE id=#{id} 8 </update> 9 10 <select id = "queryListPerson" resultType = "com.xsge.app.entity.Person"> 11 SELECT * FROM person 12 </select> 13 14 </mapper>
- 修改控制器PersonController添加測驗介面
1 /** 2 * 測驗介面:http://localhost:8080/queryListPerson 3 * 請求方式:GET 回傳值:查詢結果集 4 */ 5 @RequestMapping(value = "https://www.cnblogs.com/queryListPerson",method = RequestMethod.GET) 6 public List<Person> queryListPerson() { 7 return personService.queryListPerson(); 8 } 9 10 /** 11 * 測驗介面:http://localhost:8080/update 12 * 請求方式:POST 回傳值:更新影響行數 13 */ 14 @RequestMapping(value = "https://www.cnblogs.com/update",method = RequestMethod.POST) 15 public int update(@RequestBody Person person) { 16 return personService.update(person); 17 }
- 運行SpringBoot啟動類,測驗

4.SpringBoot整合MyBatis分頁助手
- 引入分頁助手依賴
1 <!-- SpringBoot整合MyBatis分頁助手 --> 2 <dependency> 3 <groupId>com.github.pagehelper</groupId> 4 <artifactId>pagehelper-spring-boot-starter</artifactId> 5 <version>1.2.12</version> 6 </dependency>
- 查詢前設定分頁,最后將將查詢結果封裝為PageInfo即可
1 /** 2 * 測驗介面:http://localhost:8080/queryListPersonPage 3 * 請求方式:GET 回傳值:查詢結果集,分頁查詢 4 */ 5 @RequestMapping(value = "https://www.cnblogs.com/queryListPersonPage",method = RequestMethod.GET) 6 public PageInfo<Person> queryListPersonPage() { 7 //1.執行分頁 8 PageHelper.startPage( 1, 2) ; 9 //2.執行查詢 10 List<Person> list = personService.queryListPersonPage(); 11 //3.封裝PageInfo物件 12 PageInfo<Person> pageInfo = new PageInfo<Person> (list); 13 14 return pageInfo; 15 }
- 啟動專案訪問介面測驗
略
5.訪問Druid監控后臺
訪問Druid監控后臺,查看SQL監控資訊:訪問:http://localhost:8080/druid 會自動跳轉至Druid后臺監控登錄頁,輸入自定義配置的賬戶/密碼(xsge,xsge)即可登錄查看詳情,

說明:博主的每一篇檔案都是承上啟下的,因此如果看不懂,或者缺少配置導致無法執行,請參考上一集SpringBoot內容,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/208569.html
標籤:Java
上一篇:AQS原始碼深入分析之條件佇列-你知道Java中的阻塞佇列是如何實作的嗎?
下一篇:技術點4:jQuery
