六、快速啟動框架:SpringBoot3實戰-個人版

六、快速啟動框架:SpringBoot3實戰

文章目錄

  • 六、快速啟動框架:SpringBoot3實戰
    • 一、SpringBoot3介紹
      • 1.1 SpringBoot3簡介
      • 1.2 系統要求
      • 1.3 快速入門
      • 1.4 入門總結
      • 回顧復習
    • 二、SpringBoot3配置文件
      • 2.1 統一配置管理概述
      • 2.2 屬性配置文件使用
      • 2.3 YAML配置文件使用
      • 2.4 批量配置文件注入
      • 2.5 多環境配置和使用
      • 回顧復習
    • 三、SpringBoot3整合SpringMVC
      • 3.1 實現過程
      • 3.2 web相關配置
      • 3.3 靜態資源處理
      • 3.4 自定義攔截器(SpringMVC配置)
      • 回顧復習
    • 四、SpringBoot3整合Druid數據源
      • 回顧復習
    • 五、SpringBoot3整合Mybatis
      • 5.1 MyBatis整合步驟
      • 5.2 Mybatis整合實踐
      • 5.3 聲明式事務整合配置
      • 5.4 AOP整合配置
      • 回顧復習
    • 六、SpringBoot3項目打包和運行
      • 6.1 添加打包插件
      • 6.2 執行打包
      • 6.3 命令啟動和參數說明
      • 回顧復習

一、SpringBoot3介紹

1.1 SpringBoot3簡介

課程使用SpringBoot版本:3.0.5

https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.introducing-spring-boot

到目前為止,你已經學習了多種配置Spring程序的方式。但是無論使用XML、注解、Java配置類還是他們的混合用法,你都會覺得配置文件過于復雜和繁瑣,讓人頭疼!

SpringBoot 幫我們簡單、快速地創建一個獨立的、生產級別的 Spring 應用(說明:SpringBoot底層是Spring),大多數 SpringBoot 應用只需要編寫少量配置即可快速整合 Spring 平臺以及第三方技術!

SpringBoot的主要目標是:

  • 為所有 Spring 開發提供更快速、可廣泛訪問的入門體驗。
  • 開箱即用,設置合理的默認值,但是也可以根據需求進行適當的調整。
  • 提供一系列大型項目通用的非功能性程序(如嵌入式服務器、安全性、指標、運行檢查等)。
  • 約定大于配置,基本不需要主動編寫配置類、也不需要 XML 配置文件。

總結:簡化開發,簡化配置,簡化整合,簡化部署,簡化監控,簡化運維。

1.2 系統要求

技術&工具版本(or later)
maven3.6.3 or later 3.6.3 或更高版本
Tomcat10.0+
Servlet9.0+
JDK17+

1.3 快速入門

場景:瀏覽器發送 /hello請求,返回"Hello,Spring Boot 3!"

  1. 開發步驟

    1. 創建Maven工程
    2. 添加依賴(springboot父工程依賴 , web啟動器依賴)
    3. 編寫啟動引導類(springboot項目運行的入口)
    4. 編寫處理器Controller
    5. 啟動項目
  2. 創建項目

  3. 添加依賴

    3.1 添加父工程坐標

    SpringBoot可以幫我們方便的管理項目依賴 , 在Spring Boot提供了一個名為spring-boot-starter-parent的工程,里面已經對各種常用依賴的版本進行了管理,我們的項目需要以這個項目為父工程,這樣我們就不用操心依賴的版本問題了,需要什么依賴,直接引入坐標(不需要添加版本)即可!

    <!--所有springboot項目都必須繼承自 spring-boot-starter-parent-->
    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version>
    </parent>
    

    3.2 添加web啟動器

    為了讓Spring Boot幫我們完成各種自動配置,我們必須引入Spring Boot提供的自動配置依賴,我們稱為啟動器。因為我們是web項目,這里我們引入web啟動器,在 pom.xml 文件中加入如下依賴:

    <dependencies>
    <!--web開發的場景啟動器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
    </dependencies>
    
  4. 創建啟動類

    創建package:com.atguigu

    創建啟動類:MainApplication

    package com.atguigu;import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @SpringBootApplication是一個特殊的注解,用于標識一個Spring Boot應用程序的入口類。它的主要作用是將三個常用注解組合在一起,簡化了配置的過程。** 具體而言,@SpringBootApplication注解包含以下三個注解的功能:*     @Configuration:將該類標識為應用程序的配置類。它允許使用Java代碼定義和配置Bean。*     @EnableAutoConfiguration:啟用Spring Boot的自動配置機制。它根據項目的依賴項自動配置Spring應用程序的行為。自動配置根據類路徑、注解和配置屬性等條件來決定要使用的功能和配置。*     @ComponentScan:自動掃描并加載應用程序中的組件,如控制器、服務、存儲庫等。它默認掃描@SpringBootApplication注解所在類的包及其子包中的組件。** 使用@SpringBootApplication注解,可以將上述三個注解的功能集中在一個注解上,簡化了配置文件的編寫和組件的加載和掃描過程。它是Spring Boot應用程序的入口點,標識了應用程序的主類,* 并告訴Spring Boot在啟動時應如何配置和加載應用程序。*/
    @SpringBootApplication
    public class MainApplication {//SpringApplication.run() 方法是啟動 Spring Boot 應用程序的關鍵步驟。它創建應用程序上下文、// 自動配置應用程序、啟動應用程序,并處理命令行參數,使應用程序能夠運行和提供所需的功能public static void main(String[] args) {SpringApplication.run(MainApplication.class,args);}
    }
    
  5. 編寫處理器Controller

    創建package:com.atguigu.controller

    創建類:HelloController

    注意: IoC和DI注解需要在啟動類的同包或者子包下方可生效!無需指定,約束俗稱。

    package com.atguigu.controller;import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class HelloController {@GetMapping("/hello")public String hello(){return "Hello,Spring Boot 3!";}}
    
  6. 啟動測試

1.4 入門總結

  1. 為什么依賴不需要寫版本?

    • 每個boot項目都有一個父項目spring-boot-starter-parent
    • parent的父項目是spring-boot-dependencies
    • 父項目 版本仲裁中心,把所有常見的jar的依賴版本都聲明好了。
    • 比如:mysql-connector-j
  2. 啟動器(Starter)是何方神圣?

    Spring Boot提供了一種叫做Starter的概念,它是一組預定義的依賴項集合,旨在簡化Spring應用程序的配置和構建過程。Starter包含了一組相關的依賴項,以便在啟動應用程序時自動引入所需的庫、配置和功能。

    主要作用如下:

    1. 簡化依賴管理:Spring Boot Starter通過捆綁和管理一組相關的依賴項,減少了手動解析和配置依賴項的工作。只需引入一個相關的Starter依賴,即可獲取應用程序所需的全部依賴。
    2. 自動配置:Spring Boot Starter在應用程序啟動時自動配置所需的組件和功能。通過根據類路徑和其他設置的自動檢測,Starter可以自動配置Spring Bean、數據源、消息傳遞等常見組件,從而使應用程序的配置變得簡單和維護成本降低。
    3. 提供約定優于配置:Spring Boot Starter遵循“約定優于配置”的原則,通過提供一組默認設置和約定,減少了手動配置的需要。它定義了標準的配置文件命名約定、默認屬性值、日志配置等,使得開發者可以更專注于業務邏輯而不是繁瑣的配置細節。
    4. 快速啟動和開發應用程序:Spring Boot Starter使得從零開始構建一個完整的Spring Boot應用程序變得容易。它提供了主要領域(如Web開發、數據訪問、安全性、消息傳遞等)的Starter,幫助開發者快速搭建一個具備特定功能的應用程序原型。
    5. 模塊化和可擴展性:Spring Boot Starter的組織結構使得應用程序的不同模塊可以進行分離和解耦。每個模塊可以有自己的Starter和依賴項,使得應用程序的不同部分可以按需進行開發和擴展。

      Spring Boot提供了許多預定義的Starter,例如spring-boot-starter-web用于構建Web應用程序,spring-boot-starter-data-jpa用于使用JPA進行數據庫訪問,spring-boot-starter-security用于安全認證和授權等等。

    使用Starter非常簡單,只需要在項目的構建文件(例如Maven的pom.xml)中添加所需的Starter依賴,Spring Boot會自動處理依賴管理和配置。

    通過使用Starter,開發人員可以方便地引入和配置應用程序所需的功能,避免了手動添加大量的依賴項和編寫冗長的配置文件的繁瑣過程。同時,Starter也提供了一致的依賴項版本管理,確保依賴項之間的兼容性和穩定性。

    spring boot提供的全部啟動器地址:

    https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.build-systems.starters

    命名規范:

    • 官方提供的場景:命名為:spring-boot-starter-*
    • 第三方提供場景:命名為:*-spring-boot-starter
  3. @SpringBootApplication注解的功效?

    @SpringBootApplication添加到啟動類上,是一個組合注解,他的功效有具體的子注解實現!

    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan
    public @interface SpringBootApplication {}

    @SpringBootApplication注解是Spring Boot框架中的核心注解,它的主要作用是簡化和加速Spring Boot應用程序的配置和啟動過程。

    具體而言,@SpringBootApplication注解起到以下幾個主要作用:

    1. 自動配置:@SpringBootApplication注解包含了@EnableAutoConfiguration注解,用于啟用Spring Boot的自動配置機制。自動配置會根據應用程序的依賴項和類路徑,自動配置各種常見的Spring配置和功能,減少開發者的手動配置工作。它通過智能地分析類路徑、加載配置和條件判斷,為應用程序提供適當的默認配置。
    2. 組件掃描:@SpringBootApplication注解包含了@ComponentScan注解,用于自動掃描并加載應用程序中的組件,例如控制器(Controllers)、服務(Services)、存儲庫(Repositories)等。它默認會掃描@SpringBootApplication注解所在類的包及其子包中的組件,并將它們納入Spring Boot應用程序的上下文中,使它們可被自動注入和使用。
    3. 聲明配置類:@SpringBootApplication注解本身就是一個組合注解,它包含了@Configuration注解,將被標注的類聲明為配置類。配置類可以包含Spring框架相關的配置、Bean定義,以及其他的自定義配置。通過@SpringBootApplication注解,開發者可以將配置類與啟動類合并在一起,使得配置和啟動可以同時發生。
      總的來說,@SpringBootApplication注解的主要作用是簡化Spring Boot應用程序的配置和啟動過程。它自動配置應用程序、掃描并加載組件,并將配置和啟動類合二為一,簡化了開發者的工作量,提高了開發效率。

回顧復習

指明一下,視頻中是創建空的工程,然后創建子模塊

創建springboot-base-quick-01子模塊

導入依賴

<parent><!-- spring-boot--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent>
 <!-- 導入對應的啟動器即可--><dependencies><!-- starter -> [ spring-webmvc servlet jackson ] --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>//這里不用寫版本,因為上面springboot已經自帶聲明版本了</dependency></dependencies>

在Main類作為啟動類,添加注解和Main.class

//1.配置類 @SpringBootConfiguration
//2.自動加載配置 @EnableAutoConfiguration 自動加載其他的配置類
//3.@ComponentScan 默認是當前類所在的包,子包的注解
@SpringBootApplication  //啟動類
public class Main {public static void main(String[] args) {// 1.創建ioc容器,加載配置  2.啟動內置的web服務器SpringApplication.run(Main.class,args); //自動創建ioc容器,啟動tomcat服務器軟件}

在同Main類同包下創建controller包以及相應的類

package com.atguigu.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** projectName: com.atguigu.controller** @author: 趙偉風* description:*/@RestController
@RequestMapping("hello")
public class HelloController {@Value("${zwf.name}")private String name;@GetMapping("boot")public String hello(){System.out.println(name);return "hello springboot3!!";}
}

編寫配置類

resources下的application.properties類


# ??springboot?????,??????? key????!
server.port=80
server.servlet.context-path=/ergouzi
#指明端口,指明訪問路徑# ?????
zwf.name=???
zwf.age=18

到controller層的類HelloController類中去讀值

 @Value("${zwf.name}")private String name;@GetMapping("boot")public String hello(){System.out.println(name);return "hello springboot3!!";}

二、SpringBoot3配置文件

2.1 統一配置管理概述

SpringBoot工程下,進行統一的配置管理,你想設置的任何參數(端口號、項目根路徑、數據庫連接信息等等)都集中到一個固定位置和命名的配置文件(application.propertiesapplication.yml)中!

配置文件應該放置在Spring Boot工程的src/main/resources目錄下。這是因為src/main/resources目錄是Spring Boot默認的類路徑(classpath),配置文件會被自動加載并可供應用程序訪問。

功能配置參數說明:

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

細節總結:

  • 集中式管理配置。統一在一個文件完成程序功能參數設置和自定義參數聲明 。

  • 位置:resources文件夾下,必須命名application 后綴 .properties / .yaml / .yml 。

  • 如果同時存在application.properties | application.yml(.yaml) , properties的優先級更高。

  • 配置基本都有默認值。

2.2 屬性配置文件使用

  1. 配置文件

    在 resource 文件夾下面新建 application.properties 配置文件

    # application.properties 為統一配置文件
    # 內部包含: 固定功能的key,自定義的key
    # 此處的配置信息,我們都可以在程序中@Value等注解讀取# 固定的key
    # 啟動端口號
    server.port=80 # 自定義
    spring.jdbc.datasource.driverClassName=com.mysql.cj.jdbc.driver
    spring.jdbc.datasource.url=jdbc:mysql:///springboot_01
    spring.jdbc.datasource.username=root
    spring.jdbc.datasource.password=root
    
  2. 讀取配置文件

    package com.atguigu.properties;import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;@Component
    public class DataSourceProperties {@Value("${spring.jdbc.datasource.driverClassName}")private String driverClassName;@Value("${spring.jdbc.datasource.url}")private String url;@Value("${spring.jdbc.datasource.username}")private String username;@Value("${spring.jdbc.datasource.password}")private String password;// 生成get set 和 toString方法public String getDriverClassName() {return driverClassName;}public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "DataSourceProperties{" +"driverClassName='" + driverClassName + '\'' +", url='" + url + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
    }
    
  3. 測試效果

    在controller注入,輸出進行測試

    @Autowired
    private DataSourceProperties dataSourceProperties ;@RequestMapping(path = "/hello")
    public String sayHello() {System.out.println(dataSourceProperties);return "Hello Spring Boot ! " ;
    }
    

    瀏覽器訪問路徑,控制臺查看效果

2.3 YAML配置文件使用

  1. yaml格式介紹

    YAML(YAML Ain’t Markup Language)是一種基于層次結構的數據序列化格式,旨在提供一種易讀、人類友好的數據表示方式。

    .properties文件相比,YAML格式有以下優勢:

    1. 層次結構:YAML文件使用縮進和冒號來表示層次結構,使得數據之間的關系更加清晰和直觀。這樣可以更容易理解和維護復雜的配置,特別適用于深層次嵌套的配置情況。
    2. 自我描述性:YAML文件具有自我描述性,字段和值之間使用冒號分隔,并使用縮進表示層級關系。這使得配置文件更易于閱讀和理解,并且可以減少冗余的標點符號和引號。
    3. 注釋支持:YAML格式支持注釋,可以在配置文件中添加說明性的注釋,使配置更具可讀性和可維護性。相比之下,.properties文件不支持注釋,無法提供類似的解釋和說明。
    4. 多行文本:YAML格式支持多行文本的表示,可以更方便地表示長文本或數據塊。相比之下,.properties文件需要使用轉義符或將長文本拆分為多行。
    5. 類型支持:YAML格式天然支持復雜的數據類型,如列表、映射等。這使得在配置文件中表示嵌套結構或數據集合更加容易,而不需要進行額外的解析或轉換。
    6. 更好的可讀性:由于YAML格式的特點,它更容易被人類讀懂和解釋。它減少了配置文件中需要的特殊字符和語法,讓配置更加清晰明了,從而減少了錯誤和歧義。
      綜上所述,YAML格式相對于.properties文件具有更好的層次結構表示、自我描述性、注釋支持、多行文本表示、復雜數據類型支持和更好的可讀性。這些特點使YAML成為一種有力的配置文件格式,尤其適用于復雜的配置需求和人類可讀的場景。然而,選擇使用YAML還是.properties取決于實際需求和團隊的偏好,簡單的配置可以使用.properties,而復雜的配置可以選擇YAML以獲得更多的靈活性和可讀性
  2. yaml語法說明

    1. 數據結構用樹形結構呈現,通過縮進來表示層級,
    2. 連續的項目(集合)通過減號 ” - ” 來表示
    3. 鍵值結構里面的key/value對用冒號 ” : ” 來分隔。
    4. YAML配置文件的擴展名是yaml 或 yml
    5. 例如:
      # YAML配置文件示例
      app_name: 我的應用程序
      version: 1.0.0
      author: 張三database:host: localhostport: 5432username: adminpassword: password123features:- 登錄- 注冊- 儀表盤settings:analytics: truetheme: dark
      
  3. 配置文件

    spring:jdbc:datasource:driverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql:///springboot_02username: rootpassword: rootserver:port: 80
    
  4. 讀取配置文件

    讀取方式和properties一致

    package com.atguigu.properties;import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;@Component
    public class DataSourceProperties {@Value("${spring.jdbc.datasource.driverClassName}")private String driverClassName;@Value("${spring.jdbc.datasource.url}")private String url;@Value("${spring.jdbc.datasource.username}")private String username;@Value("${spring.jdbc.datasource.password}")private String password;// 生成get set 和 toString方法public String getDriverClassName() {return driverClassName;}public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "DataSourceProperties{" +"driverClassName='" + driverClassName + '\'' +", url='" + url + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
    }
    
  5. 測試效果

    在controller注入,輸出進行測試

    @Autowired
    private DataSourceProperties dataSourceProperties ;@RequestMapping(path = "/hello")
    public String sayHello() {System.out.println(dataSourceProperties);return "Hello Spring Boot ! " ;
    }
    

    瀏覽器訪問路徑,控制臺查看效果

2.4 批量配置文件注入

@ConfigurationProperties是SpringBoot提供的重要注解, 他可以將一些配置屬性批量注入到bean對象。

  1. 創建類,添加屬性和注解

    在類上通過@ConfigurationProperties注解聲明該類要讀取屬性配置

    prefix=“spring.jdbc.datasource” 讀取屬性文件中前綴為spring.jdbc.datasource的值。前綴和屬性名稱和配置文件中的key必須要保持一致才可以注入成功

    package com.atguigu.properties;import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;@Component
    @ConfigurationProperties(prefix = "spring.jdbc.datasource")
    public class DataSourceConfigurationProperties {private String driverClassName;private String url;private String username;private String password;public String getDriverClassName() {return driverClassName;}public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "DataSourceConfigurationProperties{" +"driverClassName='" + driverClassName + '\'' +", url='" + url + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
    }
    
  2. 測試效果

    @RestController
    public class HelloController {@Autowiredprivate DataSourceProperties dataSourceProperties;@Autowiredprivate DataSourceConfigurationProperties dataSourceConfigurationProperties;@GetMapping("/hello")public String hello(){System.out.println("dataSourceProperties = " + dataSourceProperties);System.out.println("dataSourceConfigurationProperties = " + dataSourceConfigurationProperties);return "Hello,Spring Boot 3!";}
    }
    

    瀏覽器訪問路徑,控制臺查看效果

2.5 多環境配置和使用

  1. 需求

    在Spring Boot中,可以使用多環境配置來根據不同的運行環境(如開發、測試、生產)加載不同的配置。SpringBoot支持多環境配置讓應用程序在不同的環境中使用不同的配置參數,例如數據庫連接信息、日志級別、緩存配置等。

    以下是實現Spring Boot多環境配置的常見方法:

    1. 屬性文件分離:將應用程序的配置參數分離到不同的屬性文件中,每個環境對應一個屬性文件。例如,可以創建application-dev.propertiesapplication-prod.propertiesapplication-test.properties等文件。在這些文件中,可以定義各自環境的配置參數,如數據庫連接信息、端口號等。然后,在application.properties中通過spring.profiles.active屬性指定當前使用的環境。Spring Boot會根據該屬性來加載對應環境的屬性文件,覆蓋默認的配置。
    2. YAML配置文件:與屬性文件類似,可以將配置參數分離到不同的YAML文件中,每個環境對應一個文件。例如,可以創建application-dev.ymlapplication-prod.ymlapplication-test.yml等文件。在這些文件中,可以使用YAML語法定義各自環境的配置參數。同樣,通過spring.profiles.active屬性指定當前的環境,Spring Boot會加載相應的YAML文件。
    3. 命令行參數(動態):可以通過命令行參數來指定當前的環境。例如,可以使用--spring.profiles.active=dev來指定使用開發環境的配置。
      通過上述方法,Spring Boot會根據當前指定的環境來加載相應的配置文件或參數,從而實現多環境配置。這樣可以簡化在不同環境之間的配置切換,并且確保應用程序在不同環境中具有正確的配置。
  2. 多環境配置(基于方式b實踐)

    創建開發、測試、生產三個環境的配置文件
    application-dev.yml(開發)

    spring:jdbc:datasource:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///devusername: rootpassword: root
    

    application-test.yml(測試)

    spring:jdbc:datasource:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///testusername: rootpassword: root
    

    application-prod.yml(生產)

    spring:jdbc:datasource:driverClassName: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///produsername: rootpassword: root
    
  3. 環境激活

    spring:profiles:active: dev
    
  4. 測試效果

    注意 :

    如果設置了spring.profiles.active,并且和application有重疊屬性,以active設置優先。

    如果設置了spring.profiles.active,和application無重疊屬性,application設置依然生效!

回顧復習

創建新模塊,springboot-base-application-02(注意如果自己沒有創建父工程那就相當于新的項目,重新設置一下,組件名稱)

配置依賴,使其成為boot工程

<parent><!-- spring-boot--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent>

導入web依賴

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

將Main 作為啟動類

package com.atguigu;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication  //自己是一個配置類,自動加載其他啟動器配置類(ioc),掃描當前啟動類所在的包和子包的ioc和di注解
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);}
}

配置文件編寫方式1:properties

application.properties


# web ????????? ?????
# properties
# key = value# application???? - springboot - ?????????????? - ??key????
# key???? server.port server.servlet.context-path ????
server.port=80
server.servlet.context-path=/bootzwf.info.age=18
zwf.info.name=???
zwf.root.username=root
zwf.root.password=123456

方式2:.yml或.yaml都可以

application.yml

# server.port=80
# server.servlet.context-path=/boot# yaml有層次,可以繼承的配置文件格式
# key:
# 縮進key:   -> key.key# springboot規定的配置,有特殊含義
server:port: 80servlet:context-path: /boot# 數據庫連接信息     測試庫  開發的庫  上線zwf:user:username: adminapplication #注意空格gfs:- a- b- c#zwf:
#  user:
#    username: root
#    password: 123456
#    gfs:
#      - a
#      - b
#      - c
#    gfs:
#      - 高圓圓
#      - 范冰冰spring:profiles:active: test,dev # 激活外部的配置  application-test | application-dev# 外部配置的key和application key重復  外部的覆蓋內部!!# jar  --active=test

讀取配置的值

方式1:通過…層級的模式

創建pojo包下的User實體類

package com.atguigu.pojo;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;/*** projectName: com.atguigu.pojo** @author: 趙偉風**   讀取配置的方式1: @Value*       直接可以在屬性上添加即可*       @Value(key必須寫全了)*       @value只能讀取單個值*   批量配置讀取:*      @ConfigurationProperties(prefix = "zwf.user") 通用的前綴*      實體類*        屬性名 = 最后一個key的值*      優勢1: 方便 不用一個一個讀取*      優勢2: 可以給集合類型賦值**/
@Data
@Component
@ConfigurationProperties(prefix = "zwf.user")
public class User {//@Value("${zwf.user.username}") //diprivate String username; //等于key//@Value("${zwf.user.password}") //diprivate String password;//@Value("${zwf.user.gfs}") //diprivate List<String> gfs;
}

創建controller層的UserController類

package com.atguigu.controller;import com.atguigu.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** projectName: com.atguigu.controller** @author: 趙偉風* description:*/@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate User user;@GetMapping("show")public User show(){return user;}}

方式二:批量讀取

只需要在類上加上

@ConfigurationProperties(prefix = "zwf.user")

多種環境

三、SpringBoot3整合SpringMVC

3.1 實現過程

  1. 創建程序

  2. 引入依賴

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent><groupId>com.atguigu</groupId><artifactId>springboot-starter-springmvc-03</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--        web開發的場景啟動器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>
    
  3. 創建啟動類

    @SpringBootApplication
    public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class,args);}
    }
  4. 創建實體類

    package com.atguigu.pojo;public class User {private String username ;private String password ;private Integer age ;private String sex ;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}
    }
    
  5. 編寫Controller

    package com.atguigu.controller;import com.atguigu.pojo.User;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;@Controller
    @RequestMapping("/user")
    public class UserController {@GetMapping("/getUser")@ResponseBodypublic User getUser(){User user = new User();user.setUsername("楊過");user.setPassword("123456");user.setAge(18);user.setSex("男");return user;}
    }
    
  6. 訪問測試

3.2 web相關配置

位置:application.yml

# web相關的配置
# https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.server
server:# 端口號設置port: 80# 項目根路徑servlet:context-path: /boot

當涉及Spring Boot的Web應用程序配置時,以下是五個重要的配置參數:

  1. server.port: 指定應用程序的HTTP服務器端口號。默認情況下,Spring Boot使用8080作為默認端口。您可以通過在配置文件中設置server.port來更改端口號。
  2. server.servlet.context-path: 設置應用程序的上下文路徑。這是應用程序在URL中的基本路徑。默認情況下,上下文路徑為空。您可以通過在配置文件中設置server.servlet.context-path屬性來指定自定義的上下文路徑。
  3. spring.mvc.view.prefixspring.mvc.view.suffix: 這兩個屬性用于配置視圖解析器的前綴和后綴。視圖解析器用于解析控制器返回的視圖名稱,并將其映射到實際的視圖頁面。spring.mvc.view.prefix定義視圖的前綴,spring.mvc.view.suffix定義視圖的后綴。
  4. spring.resources.static-locations: 配置靜態資源的位置。靜態資源可以是CSS、JavaScript、圖像等。默認情況下,Spring Boot會將靜態資源放在classpath:/static目錄下。您可以通過在配置文件中設置spring.resources.static-locations屬性來自定義靜態資源的位置。
  5. spring.http.encoding.charsetspring.http.encoding.enabled: 這兩個屬性用于配置HTTP請求和響應的字符編碼。spring.http.encoding.charset定義字符編碼的名稱(例如UTF-8),spring.http.encoding.enabled用于啟用或禁用字符編碼的自動配置。

這些是在Spring Boot的配置文件中與Web應用程序相關的一些重要配置參數。根據您的需求,您可以在配置文件中設置這些參數來定制和配置您的Web應用程序

3.3 靜態資源處理

在WEB開發中我們需要引入一些靜態資源 , 例如 : HTML , CSS , JS , 圖片等 , 如果是普通的項目靜態資源可以放在項目的webapp目錄下。現在使用Spring Boot做開發 , 項目中沒有webapp目錄 , 我們的項目是一個jar工程,那么就沒有webapp,我們的靜態資源該放哪里呢?

  1. 默認路徑

    在springboot中就定義了靜態資源的默認查找路徑:

    package org.springframework.boot.autoconfigure.web;
    //..................
    public static class Resources {private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};private String[] staticLocations;private boolean addMappings;private boolean customized;private final Chain chain;private final Cache cache;public Resources() {this.staticLocations = CLASSPATH_RESOURCE_LOCATIONS;this.addMappings = true;this.customized = false;this.chain = new Chain();this.cache = new Cache();}
    //...........        
    

    默認的靜態資源路徑為:

    · classpath:/META-INF/resources/

    · classpath:/resources/

    · classpath:/static/

    · classpath:/public/

    我們只要靜態資源放在這些目錄中任何一個,SpringMVC都會幫我們處理。 我們習慣會把靜態資源放在classpath:/static/ 目錄下。在resources目錄下創建index.html文件

    打開瀏覽器輸入 : http://localhost:8080/index.html

  2. 覆蓋路徑

    # web相關的配置
    # https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.server
    server:# 端口號設置port: 80# 項目根路徑servlet:context-path: /boot
    spring:web:resources:# 配置靜態資源地址,如果設置,會覆蓋默認值static-locations: classpath:/webapp
    

    訪問地址:http://localhost/boot/login.html

3.4 自定義攔截器(SpringMVC配置)

  1. 攔截器聲明

    package com.atguigu.interceptor;import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;@Component
    public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("MyInterceptor攔截器的preHandle方法執行....");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyInterceptor攔截器的postHandle方法執行....");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("MyInterceptor攔截器的afterCompletion方法執行....");}
    }
    
  2. 攔截器配置

    正常使用配置類,只要保證,配置類要在啟動類的同包或者子包方可生效!

    package com.atguigu.config;import com.atguigu.interceptor.MyInterceptor;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
    public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor ;/*** /**  攔截當前目錄及子目錄下的所有路徑 /user/**   /user/findAll  /user/order/findAll* /*   攔截當前目錄下的以及子路徑   /user/*     /user/findAll* @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/**");}
    }
    
  3. 攔截器效果測試

回顧復習

創建springboot-base-springmvc-03模塊(注意如果沒有父工程那么還是要編寫組件)

導入相應的依賴

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent>
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

指定啟動類

package com.atguigu;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);}
}

controller層編寫HelloController類

package com.atguigu.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** projectName: com.atguigu.controller** @author: 趙偉風* description:*/@Controller
@ResponseBody
public class HelloController {@GetMapping("hello")public String ret(){return "hello";}
}

編寫application.yaml


# springmvc相關的web配置
# serverkey
server:port: 80 # 端口號 默認是8080servlet:context-path: /boot #設置項目根路徑spring:web:resources:static-locations: classpath:/webapp  #配置靜態資源文件夾# 一旦你配置了默認的靜態資源文件夾就無法訪問了  static public resources META-INF/resources# 外部訪問靜態資源的時候,不需要寫靜態資源文件夾

訪問靜態資源

默認的是放在resources下的static包下訪問,如果放在其他如:webapp 下則需要設置yml

注意訪問路徑不用加webapp

spring:web:resources:static-locations: classpath:/webapp  #配置靜態資源文件夾# 一旦你配置了默認的靜態資源文件夾就無法訪問了  static public resources META-INF/resources# 外部訪問靜態資源的時候,不需要寫靜態資源文件夾

攔截器使用

創建interceptor包下的M有Interceptor類

package com.atguigu.interceptor;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;/*** projectName: com.atguigu.interceptor** @author: 趙偉風* description:*/
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("request = " + request + ", response = " + response + ", handler = " + handler);return true;}
}

編寫配置類

config包下的web M v從Config類

package com.atguigu.config;import com.atguigu.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** projectName: com.atguigu.config** @author: 趙偉風* description:*/@Configuration
public class WebMvcConfig  implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor());}
}

四、SpringBoot3整合Druid數據源

  1. 創建程序

  2. 引入依賴

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent><groupId>com.atguigu</groupId><artifactId>springboot-starter-druid-04</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--  web開發的場景啟動器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 數據庫相關配置啟動器 jdbctemplate 事務相關--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- druid啟動器的依賴  --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.18</version></dependency><!-- 驅動類--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency></dependencies><!--    SpringBoot應用打包插件--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
    
  3. 啟動類

    @SpringBootApplication
    public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class,args);}
    }
  4. 配置文件編寫

    添加druid連接池的基本配置

    spring:datasource:# 連接池類型 type: com.alibaba.druid.pool.DruidDataSource# Druid的其他屬性配置 springboot3整合情況下,數據庫連接信息必須在Druid屬性下!druid:url: jdbc:mysql://localhost:3306/day01username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver# 初始化時建立物理連接的個數initial-size: 5# 連接池的最小空閑數量min-idle: 5# 連接池最大連接數量max-active: 20# 獲取連接時最大等待時間,單位毫秒max-wait: 60000# 申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。test-while-idle: true# 既作為檢測的間隔時間又作為testWhileIdel執行的依據time-between-eviction-runs-millis: 60000# 銷毀線程時檢測當前連接的最后活動時間和當前時間差大于該值時,關閉當前連接(配置連接在池中的最小生存時間)min-evictable-idle-time-millis: 30000# 用來檢測數據庫連接是否有效的sql 必須是一個查詢語句(oracle中為 select 1 from dual)validation-query: select 1# 申請連接時會執行validationQuery檢測連接是否有效,開啟會降低性能,默認為truetest-on-borrow: false# 歸還連接時會執行validationQuery檢測連接是否有效,開啟會降低性能,默認為truetest-on-return: false# 是否緩存preparedStatement, 也就是PSCache,PSCache對支持游標的數據庫性能提升巨大,比如說oracle,在mysql下建議關閉。pool-prepared-statements: false# 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100max-pool-prepared-statement-per-connection-size: -1# 合并多個DruidDataSource的監控數據use-global-data-source-stat: truelogging:level:root: debug
    
  5. 編寫Controller

    @Slf4j
    @Controller
    @RequestMapping("/user")
    public class UserController {@Autowiredprivate JdbcTemplate jdbcTemplate;@GetMapping("/getUser")@ResponseBodypublic User getUser(){String sql = "select * from users where id = ? ; ";User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1);log.info("查詢的user數據為:{}",user.toString());return user;}}
    
  6. 啟動測試

  7. 問題解決

    通過源碼分析,druid-spring-boot-3-starter目前最新版本是1.2.18,雖然適配了SpringBoot3,但缺少自動裝配的配置文件,需要手動在resources目錄下創建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,文件內容如下!

    com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure
    

回顧復習

創建springboot-base-druid-04模塊

導入依賴

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent>
 <dependencies><!--  web開發的場景啟動器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 數據庫相關配置啟動器 jdbctemplate 事務相關--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- druid啟動器的依賴  --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.18</version></dependency><!-- 驅動類--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency></dependencies>

創建application.yaml配置文件

spring:datasource:type: com.alibaba.druid.pool.DruidDataSource  #使用druid連接池#username: 賬號 # 如果你springboot2整合druid連接池!使用此信息配置賬號#password:druid:url: jdbc:mysql://localhost:3306/day01username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver# 初始化時建立物理連接的個數initial-size: 5# 連接池的最小空閑數量min-idle: 5# 連接池最大連接數量max-active: 20# 獲取連接時最大等待時間,單位毫秒max-wait: 60000# 申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。test-while-idle: true# 既作為檢測的間隔時間又作為testWhileIdel執行的依據time-between-eviction-runs-millis: 60000# 銷毀線程時檢測當前連接的最后活動時間和當前時間差大于該值時,關閉當前連接(配置連接在池中的最小生存時間)min-evictable-idle-time-millis: 30000# 用來檢測數據庫連接是否有效的sql 必須是一個查詢語句(oracle中為 select 1 from dual)validation-query: select 1# 申請連接時會執行validationQuery檢測連接是否有效,開啟會降低性能,默認為truetest-on-borrow: false# 歸還連接時會執行validationQuery檢測連接是否有效,開啟會降低性能,默認為truetest-on-return: false# 是否緩存preparedStatement, 也就是PSCache,PSCache對支持游標的數據庫性能提升巨大,比如說oracle,在mysql下建議關閉。pool-prepared-statements: false# 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100max-pool-prepared-statement-per-connection-size: -1# 合并多個DruidDataSource的監控數據use-global-data-source-stat: true

注意boot2 是spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource *#使用druid連接池
#username: 賬號 # *如果你
springboot2整合druid**連接池!使用此信息配置賬號
#password:

但是boot3要變了,如上

創建pojo包下的User類

package com.atguigu.pojo;import lombok.Data;/*** projectName: com.atguigu.pojo** @author: 趙偉風* description:*/@Data
public class User {private Integer id;private String name;private Integer age;private String email;
}

編寫controller包下的User Controller類

package com.atguigu.controller;import com.atguigu.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.expression.spel.ast.Literal;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** projectName: com.atguigu.controller** @author: 趙偉風* description:*/@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate JdbcTemplate jdbcTemplate;@GetMapping("list")public List<User> list(){//數據庫String sql ="select * from user;";List<User> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));return list;}
}

這里不用三層架構,直接寫的數據庫sql語句

創建啟動類Main

package com.atguigu;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);}
}

解決druid 在boot3不兼容的方法

在resources目錄下創建

org.springframework.boot.autoconfigure.AutoConfiguration.imports文件

在里面寫

com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure

即可解決

五、SpringBoot3整合Mybatis

5.1 MyBatis整合步驟

  1. 導入依賴:在您的Spring Boot項目的構建文件(如pom.xml)中添加MyBatis和數據庫驅動的相關依賴。例如,如果使用MySQL數據庫,您需要添加MyBatis和MySQL驅動的依賴。
  2. 配置數據源:在application.propertiesapplication.yml中配置數據庫連接信息,包括數據庫URL、用戶名、密碼、mybatis的功能配置等。
  3. 創建實體類:創建與數據庫表對應的實體類。
  4. 創建Mapper接口:創建與數據庫表交互的Mapper接口。
  5. 創建Mapper接口SQL實現: 可以使用mapperxml文件或者注解方式
  6. 創建程序啟動類
  7. 注解掃描:在Spring Boot的主應用類上添加@MapperScan注解,用于掃描和注冊Mapper接口。
  8. 使用Mapper接口:在需要使用數據庫操作的地方,通過依賴注入或直接實例化Mapper接口,并調用其中的方法進行數據庫操作。

5.2 Mybatis整合實踐

  1. 創建項目

  2. 導入依賴

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version>
    </parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.1</version></dependency><!-- 數據庫相關配置啟動器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- druid啟動器的依賴  --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.18</version></dependency><!-- 驅動類--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency></dependencies>
    
  3. 配置文件

    server:port: 80servlet:context-path: /
    spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:url: jdbc:mysql:///day01username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:configuration:  # setting配置auto-mapping-behavior: fullmap-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.slf4j.Slf4jImpltype-aliases-package: com.atguigu.pojo # 配置別名mapper-locations: classpath:/mapper/*.xml # mapperxml位置
    
  4. 實體類準備

    package com.atguigu.pojo;public class User {private String account ;private String password ;private Integer id ;public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Overridepublic String toString() {return "User{" +"account='" + account + '\'' +", password='" + password + '\'' +", id=" + id +'}';}
    }
    
  5. Mapper接口準備

    public interface UserMapper {List<User> queryAll();
    }
    
  6. Mapper接口實現(XML)

    位置:resources/mapper/UserMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <!-- namespace = 接口的全限定符 -->
    <mapper namespace="com.atguigu.mapper.UserMapper"><select id="queryAll" resultType="user">select * from users</select></mapper>
    
  7. 編寫三層架構代碼

    偽代碼,不添加業務接口!

    1. controller
      @Slf4j
      @Controller
      @RequestMapping("/user")
      public class UserController {@Autowiredprivate UserService userService;@GetMapping("/list")@ResponseBodypublic List<User> getUser(){List<User> userList = userService.findList();log.info("查詢的user數據為:{}",userList);return userList;}}
      
    2. service
      @Slf4j
      @Service
      public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> findList(){List<User> users = userMapper.queryAll();log.info("查詢全部數據:{}",users);return users;}
      }
      
  8. 啟動類和接口掃描

    @MapperScan("com.atguigu.mapper") //mapper接口掃描配置
    @SpringBootApplication
    public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class,args);}
    }
  9. 啟動測試

5.3 聲明式事務整合配置

依賴導入:

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

注:SpringBoot項目會自動配置一個 DataSourceTransactionManager,所以我們只需在方法(或者類)加上 @Transactional 注解,就自動納入 Spring 的事務管理了

@Transactional
public void update(){User user = new User();user.setId(1);user.setPassword("test2");user.setAccount("test2");userMapper.update(user);
}

5.4 AOP整合配置

依賴導入:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

直接使用aop注解即可:

@Component
@Aspect
public class LogAdvice {@Before("execution(* com..service.*.*(..))")public void before(JoinPoint joinPoint){System.out.println("LogAdvice.before");System.out.println("joinPoint = " + joinPoint);}}

回顧復習

創建模塊springboot-base-mybatis-05 還是和上面講的一樣,父工程

導入依賴

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></parent>
 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.1</version></dependency><!-- 數據庫相關配置啟動器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- druid啟動器的依賴  --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.18</version></dependency><!-- 驅動類--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency></dependencies>

創建Java下的mapper包下的UserMapper接口

package com.atguigu.mapper;import com.atguigu.pojo.User;import java.util.List;/*** projectName: com.atguigu.mapper** @author: 趙偉風* description:*/
public interface UserMapper {List<User> queryAll();int delete(int i);
}

創建resources下的mappers下的UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace = 接口的全限定符 -->
<mapper namespace="com.atguigu.mapper.UserMapper"><select id="queryAll" resultType="user">select * from user;</select><delete id="delete">delete from user where id = #{id}</delete></mapper>

編寫application.yml文件


# druid連接池
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:url: jdbc:mysql://localhost:3306/day01username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver# mybatis -徹底拋棄mybatis-config.xml
# mapperxml文件的位置  settings的配置  別名的配置...
mybatis:mapper-locations: classpath:/mappers/*.xml  #指定xml文件的位置type-aliases-package: com.atguigu.pojo #起別名configuration:map-underscore-to-camel-case: trueauto-mapping-behavior: fulllog-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

解決druid 在boot3不兼容的方法

在resources目錄下創建

org.springframework.boot.autoconfigure.AutoConfiguration.imports文件

在里面寫

com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure

編寫啟動類

package com.atguigu;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@MapperScan("com.atguigu.mapper") //mapper接口所在的的位置!
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);}
}

注意:在application.yml文件中指定的是mapper xml文件位置 而在啟動類的注解是mapper接口的位置

@MapperScan(“com.atguigu.mapper”) //mapper接口所在的的位置!

然后就是實現功能,Usermapper接口的放吧編寫,User Mapper.xml文件中編寫,

controller包下的UserController類編寫,然后再啟動項目

聲明式事務

編寫service包下的UserService類

package com.atguigu.service;import com.atguigu.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;/*** projectName: com.atguigu.service** @author: 趙偉風* description:*/@Service
public class UserService {@Autowiredprivate UserMapper userMapper;@Transactionalpublic void delete( ){int rows = userMapper.delete(1);System.out.println("rows = " + rows);
//        int i = 1/0;}
}

然后去mapper.xml去編寫對應的語句

然后到controller包下的UserController類去編寫

package com.atguigu.controller;import com.atguigu.mapper.UserMapper;
import com.atguigu.pojo.User;
import com.atguigu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** projectName: com.atguigu.controller** @author: 趙偉風* description:*/@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate UserMapper userMapper;@Autowiredprivate UserService userService;@GetMappingpublic List<User> query(){userService.delete();return null;}
}

aop整合配置

導入依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

編寫advice包下的LogAdvice類

package com.atguigu.advice;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;/*** projectName: com.atguigu.advice** @author: 趙偉風* description:*/
@Component
@Aspect
@Order(5)
public class LogAdvice {@Before("execution(* com..service.*.*(..))")public void before(JoinPoint point){String className = point.getTarget().getClass().getSimpleName();String methodName = point.getSignature().getName();System.out.println(className+"::"+methodName+" 開始執行了!");}
}

六、SpringBoot3項目打包和運行

6.1 添加打包插件

在Spring Boot項目中添加spring-boot-maven-plugin插件是為了支持將項目打包成可執行的可運行jar包。如果不添加spring-boot-maven-plugin插件配置,使用常規的java -jar命令來運行打包后的Spring Boot項目是無法找到應用程序的入口點,因此導致無法運行。

<!--    SpringBoot應用打包插件-->
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

6.2 執行打包

在idea點擊package進行打包

可以在編譯的target文件中查看jar包

6.3 命令啟動和參數說明

java -jar命令用于在Java環境中執行可執行的JAR文件。下面是關于java -jar命令的說明:

命令格式:java -jar  [選項] [參數] <jar文件名>
  1. -D<name>=<value>:設置系統屬性,可以通過System.getProperty()方法在應用程序中獲取該屬性值。例如:java -jar -Dserver.port=8080 myapp.jar
  2. -X:設置JVM參數,例如內存大小、垃圾回收策略等。常用的選項包括:
    • -Xmx<size>:設置JVM的最大堆內存大小,例如 -Xmx512m 表示設置最大堆內存為512MB。
    • -Xms<size>:設置JVM的初始堆內存大小,例如 -Xms256m 表示設置初始堆內存為256MB。
  3. -Dspring.profiles.active=<profile>:指定Spring Boot的激活配置文件,可以通過application-<profile>.propertiesapplication-<profile>.yml文件來加載相應的配置。例如:java -jar -Dspring.profiles.active=dev myapp.jar

啟動和測試:

注意: -D 參數必須要在jar之前!否者不生效!

回顧復習

導入插件

    <!--    SpringBoot應用打包插件--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

maven →clear→package

然后target就會出現打包好的 .jar包

將其指定一個文件夾路徑 染后在對應的路徑下 輸入cmd

java -jar tab 補全 ctrl +c 終止

為了后期更改方便通常是在properties.yml文件不寫,然后在執行jar包時填寫相應的配置

eg:指定端口 Java -jar -Dserver.port=8888 springboot-base-mybatis-05-1.0-SNAPSHOT.jar

eg: Java -jar -Dserver.port=8888 -Dspring.profiles.active=xxxx,jj springboot-base-mybatis-05-1.0-SNAPSHOT.jar

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40813.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

短劇app開發搭建需要哪些資質證件?

短劇APP需要辦理的資質包括增值電信業務經營許可證&#xff08;ICP&#xff09;、網絡文化經營許可證&#xff08;文網文&#xff09;、廣播電視節目制作經營許可證&#xff0c;以及軟件著作權&#xff08;軟著&#xff09;。 增值電信業務經營許可證&#xff08;ICP&#xff…

ODOO17的郵件機制-系統自動推送修改密碼的郵件

用戶收到被要求重置密碼的郵件&#xff1a; 我們來分析一下ODOO此郵件的工作機制&#xff1a; 1、郵件模板定義 2、渲染模板的函數&#xff1a; 3、調用此函數的機制&#xff1a; 當用戶移除或增加了信任的設備&#xff08;如電腦、手機端等&#xff09;&#xff0c;系統會自…

Python爬蟲之什么是逆向工程?逆向是什么?

Python爬蟲之什么是逆向工程&#xff1f;逆向是什么&#xff1f; 在Python爬蟲領域&#xff0c;逆向工程是一種重要的技術手段&#xff0c;尤其在面對復雜的網站結構和加密的數據時。逆向工程通常涉及對目標網站的分析&#xff0c;包括其前端代碼、后端邏輯、數據傳輸方式等&am…

CentOS 7.9 停止維護(2024-6-30)后可用在線yum源 —— 筑夢之路

眾所周知&#xff0c;centos 7 在2024年6月30日&#xff0c;生命周期結束&#xff0c;官方不再進行支持維護&#xff0c;而很多環境一時之間無法完全更新替換操作系統&#xff0c;因此對于yum源還是需要的&#xff0c;特別是對于互聯網環境來說&#xff0c;在線yum源使用方便很…

三級_網絡技術_01_網絡系統結構與設計的基本原則

1.下列關于RPR技術的描述中&#xff0c;錯誤的是()。 RPR與FDDI一樣使用雙環結構 在RPR環中&#xff0c;源節點向目的節點成功發出的數據幀要由目的節點從環中收回 RPR環中每一個節點都執行MPLS公平算法 RPR環能夠在50ms內實現自愈 2.下列關于RPR技術的描述中&#xff0c;…

從0到1:培訓老師預約小程序開發筆記二

背景調研 培訓老師預約小程序&#xff1a; 教師和學生可以更便捷地安排課程&#xff0c;并提升教學質量和學習效果&#xff0c;使之成為管理和提升教學效果的強大工具。培訓老師可以在小程序上設置自己的可預約時間&#xff0c;學員可以根據老師的日程安排選擇合適的時間進行預…

記錄第一次使用air熱更新golang項目

下載 go install github.com/cosmtrek/airlatest 下載時提示&#xff1a; module declares its path as: github.com/air-verse/air but was required as: github.com/cosmtrek/air 此時&#xff0c;需要在go.mod中加上這么一句&#xff1a; replace github.com/cosmtrek/air &…

如何使用Pip從Git倉庫安裝Python包:深入探索遠程依賴管理

如何使用Pip從Git倉庫安裝Python包&#xff1a;深入探索遠程依賴管理 Python的包管理工具Pip使得安裝和管理Python庫變得非常簡單。有時&#xff0c;我們需要安裝那些尚未發布到PyPI的包&#xff0c;或者想要嘗試最新的開發版本。這時&#xff0c;可以直接從Git倉庫安裝包。本…

qt QGridLayout 簡單實驗1

1.概要 2.實驗 2.1 實驗1 簡單實驗跨行 2.1.1 代碼 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~W…

STM32 - 內存分區與OTA

最近搞MCU&#xff0c;發現它與SOC之間存在諸多差異&#xff0c;不能沿用SOC上一些技術理論。本文以STM L4為例&#xff0c;總結了一些STM32 小白入門指南。 標題MCU沒有DDR&#xff1f; 是的。MCU并沒有DDR&#xff0c;而是讓代碼存儲在nor flash上&#xff0c;臨時變量和棧…

yolov5實例分割跑通以及C#讀取yolov5_Seg實例分割轉換onnx進行檢測部署

一、首先需要訓練yolov5_seg的模型&#xff0c;可以去網上學習&#xff0c;或者你直接用我的&#xff0c; 訓練環境和yolov5—7.0的環境一樣&#xff0c;你可以直接拷過來用。 yolov5_seg算法 鏈接&#xff1a;https://pan.baidu.com/s/1m-3lFWRHwg5t8MmIOKm4FA 提取碼&…

【MySQL】1.初識MySQL

初識MySQL 一.MySQL 安裝1.卸載已有的 MySQL2.獲取官方 yum 源3.安裝 MySQL4.登錄 MySQL5.配置 my.cnf 二.MySQL 數據庫基礎1.MySQL 是什么&#xff1f;2.服務器&#xff0c;數據庫和表3.mysqld 的層狀結構4.SQL 語句分類 一.MySQL 安裝 1.卸載已有的 MySQL //查詢是否有相關…

《Windows API每日一練》8.3 scrollbar控件

在第三章SYSMETS2.C實例中&#xff0c;我們是通過CreateWindow函數創建窗口的參數窗口樣式中添加垂直或水平滾動條。本節我們將講述作為子窗口控件的滾動條。 本節必須掌握的知識點&#xff1a; 滾動條類 滾動條控件和著色 8.3.1 滾動條類 ■窗口滾動條與滾動條控件的異同 …

Python常量與變量的終極指南:從基礎到進階的15個要點

今天&#xff0c;我們將一起揭開Python中最基本但也極其重要的概念——常量與變量的神秘面紗。別擔心&#xff0c;我會用最簡單直白的語言&#xff0c;讓你從入門到略有小成&#xff0c;一步步掌握這些核心知識。準備好你的筆記本&#xff0c;讓我們開始這場Python之旅吧&#…

在Linux環境下搭建Redis服務結合內網穿透實現通過GUI工具遠程管理數據庫

文章目錄 前言1. 安裝Docker步驟2. 使用docker拉取redis鏡像3. 啟動redis容器4. 本地連接測試4.1 安裝redis圖形化界面工具4.2 使用RDM連接測試 5. 公網遠程訪問本地redis5.1 內網穿透工具安裝5.2 創建遠程連接公網地址5.3 使用固定TCP地址遠程訪問 前言 本文主要介紹如何在Li…

mysql 9 新特新

mysql9新特性 新特性Audit Log NotesC API NotesCharacter Set SupportCompilation NotesComponent NotesConfiguration NotesData Dictionary NotesData Type NotesDeprecation and Removal NotesEvent Scheduler NotesJavaScript ProgramsOptimizer NotesPerformance Schema …

Spring中的事件監聽器使用學習

一、什么是Spring中的事件監聽機制&#xff1f; Spring框架中的事件監聽機制是一種設計模式&#xff0c;它允許你定義和觸發事件&#xff0c;同時允許其他組件監聽這些事件并在事件發生時作出響應。這種機制基于觀察者模式&#xff0c;提供了一種松耦合的方式來實現組件間的通信…

Linux 系統性能分析與故障排查:從入門到進階

Linux 系統性能分析與故障排查&#xff1a;從入門到進階 作為系統管理員或 IT 專業人員&#xff0c;掌握系統性能分析和故障排查技能至關重要。這些技能可以幫助你識別和解決系統性能問題&#xff0c;確保系統穩定運行。本文將介紹系統性能分析和故障排查的基本方法&#xff0…

CTF實戰:從入門到提升

CTF實戰&#xff1a;從入門到提升 &#x1f680;前言 沒有網絡安全就沒有國家安全&#xff0c;網絡安全不僅關系到國家整體信息安全&#xff0c;也關系到民生安全。近年來&#xff0c;隨著全國各行各業信息化的發展&#xff0c;網絡與信息安全得到了進一步重視&#xff0c;越…

XAML 框架橫向對比

多年來&#xff0c;基于 XAML 的 UI 框架有了很大的發展。下面的圖表很好地證明了這個觀點。XAML UI 框架的三大巨頭&#xff1a;Avalonia UI、Uno Platform 和 .NET MAUI 都支持跨平臺的應用。事實上&#xff0c;除了 Avalonia UI&#xff0c;對跨平臺 XAML 的需求是它們發展的…