SpringBoot第五集:整合Druid和MyBatis(2020最新最易懂)

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主程式,啟動後訪問://localhost:8080/druid 會自動跳轉至Druid後台監控登錄頁,輸入自定義配置的賬戶/密碼(xsge,xsge)即可登錄查看詳情。

  更多Druid問題需求說明,請參照Druid官網常見問題

2.SpringBoot整合MyBatis

1.概述

  實際項目中,在對資料庫訪問層對資料庫進行操作時,大部分時候我們都用的MyBatis/Hibernate,所以SpringBoot整合MyBatis怎麼說也算是必修課了!!!

2.準備工作

  1. 創建資料庫。
  2. 新增對應資料庫實體類。
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Person {
        private Integer id;
        private String name;
        private String password;
    }

     

  3. 修改pom.xml引入依賴。
      以下依賴文件,並非整個項目中所有已包含的依賴,例如:熱部署,Lombok等,由於程式碼長度問題,一些基本引用的依賴,我並沒有寫入,請另行參考部落客其他SpringBoot整合文檔,自行參考導入更多所需依賴。

      Spring家族的使命就是為了簡化而生,但是隨著Spring的發展壯大,有點事與願違了。為了堅持初心,Spring家族祭出了一大殺器—Spring Boot。Spring Boot的核心理念是:不建議使用xml文件配置。但是,這對MyBatis來說進退兩難,因為MyBatis離不開xml,需要xml來配置sql語句。為了迎合Spring Boot的發展理念,MyBatis官方開發了mybatis-spring-boot-starter

     1 <!-- 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官方說明文檔

  4. 創建一個包含基本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

  1. 修改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 }
  2. 新增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 }

     

  3. 新增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 }
  4. 新增控制器PersonController
     1 @RestController
     2 public class PersonController {
     3     
     4     @Autowired
     5     private PersonService personService;
     6     /**
     7      * 測試介面://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      * 測試介面://localhost:8080/addPerson
    17      * 請求方式:put       入參:JSON數據      返回值:添加成功影響行數
    18      */
    19     @RequestMapping(value = "/addPerson",method = RequestMethod.PUT)
    20     public int addPerson(@RequestBody Person person) {
    21         return personService.add(person);
    22     }
    23     
    24 }
  5. 建議修改yml文件,添加別名和駝峰命名配置
  6. 在啟動類上添加註解@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中文網

  7. 運行SpringBoot啟動類測試

  2.Mapper介面基於XML方式實現CURD

    使用xml方式需要在application.yml中進行一些額外的配置。(通常即使在註解方式中,也會添加公共的配置)

  1. 修改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
  2. 在根目錄下增子mapper包,並添加mapper映射配置(xml文件)
     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "//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>
  3. 修改控制器PersonController添加測試介面
     1 /**
     2  * 測試介面://localhost:8080/queryListPerson
     3  * 請求方式:GET      返回值:查詢結果集
     4  */
     5 @RequestMapping(value = "/queryListPerson",method = RequestMethod.GET)
     6 public List<Person> queryListPerson() {
     7     return personService.queryListPerson();
     8 }
     9 
    10 /**
    11  * 測試介面://localhost:8080/update
    12  * 請求方式:POST      返回值:更新影響行數
    13  */
    14 @RequestMapping(value = "/update",method = RequestMethod.POST)
    15 public int update(@RequestBody Person person) {
    16     return personService.update(person);
    17 }
  4. 運行SpringBoot啟動類,測試

4.訪問Druid監控後台

  訪問Druid監控後台,查看SQL監控資訊:訪問://localhost:8080/druid 會自動跳轉至Druid後台監控登錄頁,輸入自定義配置的賬戶/密碼(xsge,xsge)即可登錄查看詳情。