SpringBoot圖文教程「概念+案例 思維導圖」「基礎篇上」

  • 2020 年 3 月 27 日
  • 筆記

有天上飛的概念,就要有落地的實現

  • 概念+程式碼實現是本文的特點,教程將涵蓋完整的圖文教程,程式碼案例
  • 每個知識點配套自測面試題,學完技術自我測試
  • 本文初學向,所以希望文中所有的程式碼案例都能敲一遍

大哥大姐新年好,點贊轉發不要少 **文本已收錄至GitHub開源倉庫 Lu_JavaNodes 碼雲倉庫地址Lu_JavaNodes ,**包含教程涉及所有思維導圖,案例程式碼和後續講解影片,歡迎Star增磚添瓦。

前言

庚子鼠年,封村兒,在試過了睡覺,打麻將,做涼皮,做蛋糕之後,我不由的陷入了對人生和社會的大思考

兩年的開發經驗和三年的大數據講師經驗告訴我,是時候寫些什麼了,我也早覺得有寫些東西的必要了。我向來是不憚以最多的無聊揣測這個假期的,但我沒想到……(不能再往下了,再往下真就算抄襲了)

於是決定將自己的的畢生功力匯聚整理成冊,寫出**《圖文教程》系列Java技術學習秘籍**,本功法力求 『圖文並茂』 『簡單易懂』,概念和程式碼實踐相結合,每個知識點輔助以自測面試題,希望大家通過本系列教程能夠快樂學Java,從練氣到飛升。

本期選擇的技術是SpringBoot,SpringBoot 現如今已是Java程式設計師的必備修鍊功法,具備SpringBoot大成的開發功力,才能行走江湖,縱橫大廠小派而不懼需求。

在正式開始學習之前,先通過思維導圖了解本教程的功法綱要

簡單說明,教程分為基礎篇,進階篇和高級篇

  • 基礎篇,本章力求簡單快速的掌握基本的SpringBoot使用,並應用到項目中
  • 進階篇,學會SpringBoot更多的常見用法以及底層原理
  • 高級篇,著重介紹SpringBoot的與各大場景的整合使用

環境要求

  • 開發工具 IDEA 版本不限
  • maven3.x
  • jdk1.8
  • 本教程採用SpringBoot 2.0.3.RELEASE

本文學習目標

  • 認識SpringBoot
  • 掌握 通過 SpringBoot 搭建web環境
  • 掌握 SpringBoot + Mybatis + Mysql 實現增刪改成的能力
  • 掌握 SpringBoot 測試的使用

SpringBoot是啥

為啥用這玩意兒

SpringBoot優點很多,對提升開發速度有很大幫助,我們通過配置文件說明一下SpringBoot的優秀。

回想往昔,在我剛畢業的時候,在一家跨境電商企業開發管理系統,這個項目採用的最傳統的SSM架構,在這個項目中充斥著大量的配置文件,什麼是大量呢?舉個栗子,如下圖

**上圖是什麼呢?**用SSM寫一個增刪改差的最少配置。

朋友萌,你萌想想,功能程式碼都沒開始寫,就要先寫這麼一堆配置,完了還不知道寫的對不對,再多想想,如果你還要做許可權管理,Redis,消息隊列,你還需要寫多少配置???這樣的開發效率 想死

不過不要慌,只要你學會了SpringBoot,通過SpringBoot 技術上面的配置文件 一個都不寫,一個都不寫,一個都不寫

oh my god 這麼好的技術,不學就是虧啊!不多說,我們一起來學它 學它 學它。

SpringBoot 簡介

Tips:本小節是SpringBoot的介紹和特點,如果想感受SpringBoot的魅力,可跳過直接閱讀 第二章節 10分鐘用上SpringBoot

Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化Spring應用的初始搭建以及開發過程。

你可以認為:springboot(微框架) = springmvc(控制器) + spring(項目管理)

特點如下

  • 創建獨立的Spring應用程式
  • 使用嵌入的Tomcat,應用無需打成war包
  • 簡化Maven配置,starters自動配置和版本控制
  • 大量自動配置,簡化開發
  • 無需xml配置,開箱即用

簡介和特點不需特別在意,在教程中會逐個詳細講解

10分鐘用上SpringBoot(第一個demo)

10分鐘用上SpringBoot 程式碼案例

本節開始第一個demo的編寫,準備好你的IDEA,SpringBoot 要來嘍。

demo需求

  • 使用SpringBoot搭建 web 環境
  • 創建UserController類,類中定義 getUser() 方法 該方法會以Json的方法返回一句話:SpringBoot 真香。
  • 運行項目能夠請求到該方法 並得到響應數據

Tips:案例程式碼 見 GitHub 和 碼雲倉庫

1.用IDEA創建一個空的maven項目 完善項目結構

2.在 pom.xml 中寫入 SpringBoot 的依賴

<?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>        <groupId>com.lu</groupId>      <artifactId>boot-hello</artifactId>      <version>1.0-SNAPSHOT</version>        <!--繼承springboot的父項目-->      <parent>          <groupId>org.springframework.boot</groupId>          <artifactId>spring-boot-starter-parent</artifactId>          <version>2.0.3.RELEASE</version>      </parent>        <dependencies>          <!--引入springboot的web支援-->          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-web</artifactId>          </dependency>      </dependencies>      </project>

3.編寫SpringBoot的啟動類 【SpringBoot項目的特點】可以啟動Spring Boot項目

啟動類的位置

啟動類程式碼如下

/**   * 啟動類規則   * 1.啟動類位置:主包下面和子包同級   * 2.需要一個@SpringBootApplication   */  @SpringBootApplication  public class AppRun {      public static void main(String[] args) {  //        參數:啟動類類對象 主函數形參名          SpringApplication.run(AppRun.class,args);      }  }

4.編寫 application配置文件

Tips:通過配置文件可以做埠號,項目名等

配置文件規則

  1. 配置文件名字必須叫application
  2. 配置文件的格式有三種
    1. properties
    2. yml
    3. yaml

配置文件位置

配置文件內容

5.編寫 UserController

6.通過啟動類 啟動項目

項目正確啟動 日誌如下

通過日誌 可以知道 項目啟動在了8802 埠, 項目名(context path) 為空

7. 打開瀏覽器 訪問地址:http://localhost:8802/getUser

第一個demo 總結 程式碼詳解

恭喜你,我知道你肯定已經完成了第一個demo的效果,但是估計會有些懵逼,咋就跑起來了呢?為什麼沒用的Tomcat?pom文件配置的是啥?啟動類寫的又是啥?

朋友,不要慌,鹿老師一個個給你解釋。

SpringBoot的特點

為什麼不需要Tomcat呢?這就是SpringBoot的優點之一啊,可以回憶一下簡介部分SpringBoot的特點。如果想不起來,不用翻找,貼心的鹿老師又寫了一遍

  1. 創建獨立的Spring應用程式
  2. 使用嵌入的Tomcat,應用無需打成war包
  3. 簡化Maven配置,starters自動配置和版本控制
  4. 大量自動配置,簡化開發
  5. 無需xml配置,開箱即用

之所以不需要 單獨安裝Tomcat 是因為SpringBoot使用嵌入的Tomcat,所以SpringBoot的項目直接就可以運行起來。

pom文件依賴配置詳解

簡化Maven配置,starters自動配置和版本控制

不使用SpringBoot搭建web環境,少說也要導入七八個依賴,但是如果沒有記錯的話,demo的開發只用到了一個依賴,有點不要太少,why?

先來說明 pom寫的第一個配置 parent 父項目

<!--繼承springboot的父項目-->  <parent>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-parent</artifactId>      <version>2.0.3.RELEASE</version>  </parent>

這個配置項目是一種聲明,用來管理 SpringBoot 的應用的版本

啥意思嘞?

朋友,回想一下,導入的依賴是啥?

<!--web相關依賴-->  <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>  </dependency>

spring-boot-starter-web 就是我們導入的第二個依賴,除了名字有點長以外,最特別的是沒有寫版本號,但是沒有影響依賴的下載,因為 spring-boot-starter-web 用的是 父項目 的版本號 2.0.3.RELEAS。

這就是 父項目的作用,以後我們導入依賴默認是不需要寫版本號的。

版本號不寫了,但是 **為什麼一個依賴就夠了?**因為啟動器

什麼是啟動器,看一下 spring-boot-starter-web 這個很長的名字,這個名字需要注意的是前三個單詞 spring-boot-starter 凡是以這三個字母開頭的依賴我們都稱之為 starters(啟動器)。

Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啟動器),只需要在項目裡面引入這些starter相關場景的所有依賴都會導入進來。要用什麼功能就導入什麼場景的啟動器。

舉個栗子:spring-boot-starter-web web場景啟動器 SpringBoot將所有web項目開發能夠用的依賴都寫到了這個啟動器中,這樣導入啟動器就擁有了開發web項目需要用到的所有依賴。

綜上所述,同理:

  • 使用Redis 會有一個叫 spring-boot-starter-redis 的啟動器
  • 使用 ES 會有一個 叫 spring-boot-starter-data-mongodb 的啟動器
  • 等一百多個

啟動類講解

/**   *  @SpringBootApplication 來標註一個主程式類,說明這是一個Spring Boot應用   */  @SpringBootApplication  public class AppRun {        public static void main(String[] args) {            // Spring應用啟動起來          SpringApplication.run(HelloWorldMainApplication.class,args);      }  }

如果說我們的項目是一個火箭的話,這個類的 main函數 就是火箭的發射按鈕,運行 main方法 就運行了項目。

Tips:關於啟動類的實現原理以及配置文件的更多用法,在進階篇詳細講解。

SpringBoot + Mybatis + 測試 實現增刪改查

接著 demo 繼續往下寫 集成Mybatis

準備工作

庫表準備

在mysql資料庫中 按照 sql 創建表

SET NAMES utf8;  SET FOREIGN_KEY_CHECKS = 0;    -- ----------------------------  -- Table structure for t_user  -- ----------------------------  DROP TABLE IF EXISTS `t_user`;  CREATE TABLE `t_user` (    `id` int(11) NOT NULL AUTO_INCREMENT,    `username` varchar(255) DEFAULT NULL,    `password` varchar(255) DEFAULT NULL,    PRIMARY KEY (`id`)  ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;    -- ----------------------------  -- Records of t_user  -- ----------------------------  BEGIN;  INSERT INTO `t_user` VALUES (1, 'zhangsan', '123456');  INSERT INTO `t_user` VALUES (2, 'lisi', '123456');  COMMIT;    SET FOREIGN_KEY_CHECKS = 1;

實體類準備

在boot-hello項目的com.lu.entity包中寫入實體類

public class User {      private Integer id;      private String username;      private String password;        //get set 方法省略....  }

resources 下創建mappers目錄(放置mapper文件)

集成Mybatis

1.導入依賴

<!--       SpringBoot 集成 Mybatis的 啟動器-->          <dependency>              <groupId>org.mybatis.spring.boot</groupId>              <artifactId>mybatis-spring-boot-starter</artifactId>              <version>1.3.2</version>          </dependency>  <!--        數據源-->          <dependency>              <groupId>com.alibaba</groupId>              <artifactId>druid</artifactId>              <version>1.0.19</version>          </dependency>  <!--        mysql驅動-->          <dependency>              <groupId>mysql</groupId>              <artifactId>mysql-connector-java</artifactId>              <version>5.1.38</version>          </dependency>

說明:由於springboot整合mybatis啟動器中會默認依賴mybatis 因此不需要單獨引入mybati版本,否則會出現衝突

2.配置application配置文件

需要寫入兩種配置

  • 資料庫的相關參數
  • Mybatis的mapper文件地址的配置
#數據源配置  #指定驅動  spring.datasource.driver-class-name=com.mysql.jdbc.Driver  #指定url  spring.datasource.url=jdbc:mysql://localhost:3306/boot  #指定用戶名  spring.datasource.username=root  #指定密碼  spring.datasource.password=123456  #指定連接池類型  spring.datasource.type=com.alibaba.druid.pool.DruidDataSource    #Mybatis的配置 配置mapper文件的地址  mybatis.mapper-locations=classpath:mappers/*Mapper.xml

說明一下mapper-locations這個配置 如圖

3.在啟動類上添加 掃描dao介面的註解

4.開發DAO介面以及Mapper

publicinterface UserDao {      List<User> findAll();  }

mapper文件內容

<?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  <mapper namespace="com.lu.dao.UserDao">      <select id="findAll" resultType="com.lu.entity.User">          select * from t_user      </select>  </mapper>

現在程式碼寫完了,作為一個擁有良好習慣的程式設計師,我應該測試一下dao介面中的查詢方法能不能正常使用,但是,貌似需要運行項目在controller中調用,才能測試。

no no no 其實不需要,SpringBoot 可以 非常非常非常 方便的集成單元測試,接下來我們就用 SpringBoot Test 來測試一下我們的查詢方法。

5. 引入SpringBoot測試依賴

<!--        測試依賴-->          <dependency>              <groupId>org.springframework.boot</groupId>              <artifactId>spring-boot-starter-test</artifactId>              <scope>test</scope>          </dependency>

6.編寫測試類

測試類的位置

測試類內容

/**   * @SpringBootTest(classes = {AppRun.class}) 參數為啟動類的類對象   */  @RunWith(SpringRunner.class)  @SpringBootTest(classes = {AppRun.class})  public class TestUserDao {      @Autowired      private UserDao userDao;        /**       * 測試查詢方法       */      @Test      public void test1(){          List<User> all = userDao.findAll();  //        列印查詢結果          for (User user : all) {              System.out.println(user);          }      }  }

運行測試類 結果如下

基礎篇上總結

恭喜你完成了本章的學習,恭喜你掌握了通過SpringBoot+Mybatis 實現增刪改成的能力。為你鼓掌!

讓我們再次回顧本文的學習目標

  • 認識SpringBoot
  • 掌握 通過 SpringBoot 搭建web環境
  • 掌握 SpringBoot + Mybatis + Mysql 實現增刪改成的能力
  • 掌握 SpringBoot 測試的使用

要掌握SpringBoot更多的用法,請持續關注本系列教程。

下面體貼的我給朋友萌還準備了一些 自測面試題和項目案例,希望你能夠成熱打鐵,將知識夯紮實。

自測面試題(答案見下期)

  • 什麼是 Spring Boot?
  • 為什麼要用 Spring Boot?
  • Spring Boot 需要獨立的容器運行嗎?
  • 你如何理解 Spring Boot 中的 Starters?
  • SpringBoot 項目如何集成 Mybatis?

自測實現項目小案例(答案見下期)

Tip:在我的計劃中,更新完 SpringBoot 圖文教程系列 之後 將會更新 SpringBoot微服務電商後台管理系統實戰開發圖文教程 文後所有項目小案例的庫表均來自該項目,通過精心設計,環環相扣,通過小案例的鋪墊,後續可以直接與 微服務實戰開發教程 無縫兼容

庫表

下面這張表是 商品類別表 建表語句

CREATE TABLE `tb_category` (    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '類目id',    `name` varchar(20) NOT NULL COMMENT '類目名稱',    `parent_id` bigint(20) NOT NULL COMMENT '父類目id,頂級類目填0',    `is_parent` tinyint(1) NOT NULL COMMENT '是否為父節點,0為否,1為是',    `sort` int(4) NOT NULL COMMENT '排序指數,越小越靠前',    PRIMARY KEY (`id`),    KEY `key_parent_id` (`parent_id`) USING BTREE  ) ENGINE=InnoDB AUTO_INCREMENT=1424 DEFAULT CHARSET=utf8 COMMENT='商品類目表,類目和商品(spu)是一對多關係,類目與品牌是多對多關係';

因為商品分類會有層級關係,因此這裡我們加入了parent_id欄位,對本表中的其它分類進行自關聯。

測試數據添加sql內容過多,如有需要請訪問碼雲倉庫或通過WX獲取

需求

實現下面Service介面方法

public interface CategoryService {    //根據父節點查詢下一級商品類目數據    List<Category> queryListByParent(Long pid);  }