Spring Boot最好的學習方法就是實戰訓練,今天咱們用很短的時間啓動咱們第一個Spring Boot應用,而且鏈接咱們的MySQL數據庫. 我將假設讀者爲幾乎零基礎,在實戰講解中會滲透Spring框架中的一些知識點,並提供相關官方文檔連接, 讓咱們一塊兒在實戰中高效學習。css
在這個實戰學習中, 咱們將使用Spring Boot
與MySQL
數據庫構建一個簡單的登錄系統,功能包含註冊帳戶和登錄兩個功能,並用Spring Boot
官方推薦使用的thymeleaf
模板來生成簡單的前端頁面。niudai/Spring-by-example在這個實戰學習中, 咱們將使用Spring Boot
與MySQL
數據庫構建一個簡單的登錄系統,功能包含註冊帳戶和登錄兩個功能,並用Spring Boot
官方推薦使用的thymeleaf
模板來生成簡單的前端頁面。html
看完這篇教程,你將作出這樣一個應用:前端
能夠看到上方的"Hello, null!"字樣, null爲當前已登錄的用戶名, 若未登錄, 則顯示爲null.java
下方的註冊新帳戶, 須要填寫用戶名, 郵箱, 密碼, 常規操做, 登錄須要郵箱和密碼, 在最下方有查看全部註冊帳號信息的功能, 點擊以後能夠看到全部已註冊的帳號的所有信息.mysql
看完該文章, 你將學會:git
好, 咱們開始.github
第一步咱們須要將MySQL數據庫下載到電腦裏, 下載地址: 下載MySQL完整工具包web
在頁面中點擊紅線框住的部分:spring
點進去, 拉到頁面下方, 點擊紅框部分右側的download
:sql
下載後, 按照安裝包提示的步驟操做, 安裝完畢後, 你會得到幾個新應用, 咱們只用其中一個, 它是:
它是MySQL的命令行工具, 咱們用它來操做咱們的MySQL數據庫.
可是咱們不直接點開它, 咱們在Windows自帶的Command Prompt中使用它.
mysql -u root -p
進入Mysql命令行工具, 會提示你輸入密碼:
輸入在安裝過程當中設置的密碼, 進入mysql命令行工具.
CREATE USER 'niudai'@'localhost' IDENTIFIED BY 'niudai';
這個語句的目的是建立一個用戶名爲'niudai', 登錄密碼爲'niudai'的MySQL數據庫管理員, 用這個帳號能夠管理咱們的數據庫, 也就是說若是你要管理數據庫, 你必需要有這麼一個帳號.
CREATE DATABASE springdb;
熟悉SQL語言的同窗應該很熟悉上面這句, 就是建立一個名爲springdb
的數據庫, 這個數據庫就是咱們的Spring Boot應用要鏈接的.
springdb
數據庫的全部權限:GRANT ALL ON springdb.* TO 'niudai'@'localhost';
做者本人是使用Visual Studio Code
進行該應用的開發, 加裝Spring官方提供的VSCode插件, 能夠輕鬆進行開發, 固然若是你喜歡用IDEA
或Eclipse
, 或STS
也行, 但根據本人體驗, VSCode
上的體驗遠超Eclipse
和STS
, 推薦讀者嘗試.
我安裝了全套Java
, Spring
, Maven
的擴展, ctrl
+shift
+P
打開命令行, 搜索Spring Initializer
命令.
由於咱們用Java語言開發, 因此選擇Java語言:
輸入Group ID, 也就是你的這個應用所屬的羣的名稱, 咱們輸入org.springframework
(其實輸什麼都行, 無所謂).
而後輸入咱們的Artifact ID, 就是你這個項目的ID, 我輸入gs-logging-data-mysql
(隨便輸, 無所謂).
而後選擇最新Spring Boot版本, 而後選擇以下Spring Boot依賴:
一共四個依賴, 全是Spring Boot官方支持的庫, 知識點講解:
Thymeleaf
是現代服務端的Java模板引擎, 咱們用它來生成HTML頁面.JPA
是Java Persistence API, 也就是Java持久層API, 它的本質是一套將Java的對象映射到數據庫中的關係表的標準, 而Spring-Boot
的JPA
依賴包含一個重要子依賴, 你必定聽過它的名字: Hibernate
. 它是JPA
的具體實現, 也是Spring Boot
的默認JPA
實現.官方文檔相關知識點閱讀MySQL
是用來實現從Java到MySQL鏈接的一箇中間件.Web
是Spring Boot
重要核心組件, 網絡應用的必須品, 它包含了Tomcat
容器, Spring MVC
等核心組件.因此咱們也能夠看到Spring Boot
其實至關於一個依賴打包器, 好比網絡模塊, 你們都須要Tomcat
容器, 也須要Spring MVC
框架, 那索性就放到一個包裏, 也就是Web
包, 這樣一個依賴就解決了問題.
application.properties
文件的做用有點相似於pom
, 但也不太同樣, pom
是管理你應用和其餘庫的依賴關係, 而application.properties
則是去設置, 或是配置這些依賴, 是Spring應用的重要組成部分.
該文件能夠在maven工程的src/main/java/resources/applicatio.properties
下找到.
在該文件中輸入以下屬性:
spring.datasource.username=niudai spring.datasource.password=niudai spring.datasource.url=jdbc:mysql://localhost:3306/springdb spring.jpa.hibernate.ddl-auto=create
講解:
第三行的url
就是咱們數據庫的地址, 3306
是MySQL默認的本地端口, 而springdb
正是咱們以前建立的數據庫.
第一行和第二行聲明瞭咱們以前建立的用戶名密碼和帳戶名, 都爲niudai
第四行的create
爲開發模式, 就是每次應用啓動都從新建立一個新表, 原有的表會清空, 開發結束後能夠將其設置爲none
.
聲明瞭這些以後, 啓動應用後, Spring
會自動用上述的信息鏈接並登錄你的MySQL
中名爲springdb
的數據庫.
什麼是Entity
呢? 說白了就是會被映射到數據庫中的Java Object
, 好比咱們將要建立的User
類.
在src/main/java/
下建立一個文件User.java
:
package org.springframework.gsloggingdatamysql; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class User { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer id; private String name; private String email; private String password; @Override public String toString() { return "{" + " id='" + getId() + "'" + ", name='" + getName() + "'" + ", email='" + getEmail() + "'" + ", password='" + getPassword() + "'" + "}"; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } }
加了@Entity
註解, Spring
框架會得知這個類是一個Entity
, Hibernate
會把這個類映射到數據庫中的關係表, 這個關係表的列與User
的全部屬性一一對應.
至關於SQL語言中的:
CREATE TABLE User(id int, name varchar(255), email varchar(255), password varchar(255));
若是說User表明每一個用戶, 或是用戶的信息, 那麼UserRepository就表明儲存這些用戶的"庫", 咱們建立一個UserRepository.java
, 注意它是一個接口, 也就是Interface
, 而不是Class
.
package org.springframework.gsloggingdatamysql; import java.util.List; import org.springframework.data.repository.CrudRepository; public interface UserRepository extends CrudRepository<User, Integer> { List<User> findByEmail(String email); void deleteByEmail(String email); }
你可能會疑惑這只是一個接口, 並無具體實現, 如何完成對User信息的儲存, 但事實上你只需聲明這個接口, 剩下的交給Spring
, 它會自動爲你進行它的實現.
該類繼承了CrudRepository
, 也就是支撐"增刪改查"的一個Repository, 你能夠在別的地方直接調用這個接口的方法, 方法名有規範, 好比你想經過郵箱查找, 那你就使用findByEmail(String email)
方法, Spring
會自動幫你將findByEmail
轉換成SQL語言中的`SELECT * FROM UserRepository WHERE email = 'email'
Controller
是接受用戶的url
請求, 將url
映射到某個具體的方法, 處理url
請求, 再返回一個Model
的東西, 是Spring MVC
中的C
層.
知識點: Spring MVC中的三層分別是Model
, View
, Controller
. 當用戶向你的服務器發送了請求後, 好比HTTP請求, Controller
先將請求映射到某個方法上, 方法根據該請求進行相應處理, 返回Model
, 這個Model
能夠被理解成一個抽象的數據模型, 它儲存了網頁必須包含的信息, 可是它不是網頁自己, Model
會被送到View
層, 也就是用戶界面層, View
層將本身自己的模板和Model
內部的數據結合成爲完整的一個頁面, 做爲response
返還給用戶, 用戶便看到了你的頁面, 可是如今隨着先後端的分離, View
層的意義已經不大,做爲後端開發, 主要專一於Model
和Controller
.
建立一個文件: UserController.java
:
package org.springframework.gsloggingdatamysql; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class UserController { private static final Logger log = LoggerFactory.getLogger(UserController.class); @Autowired private UserRepository userRepository; @GetMapping(path="/add") // Map ONLY GET REQUESTs. public @ResponseBody String addNewUser (@RequestParam String name , @RequestParam String email, @RequestParam String password, User user) { // @ResponseBody means the returned String is a response, not a view name. user.setName(name); user.setEmail(email); user.setPassword(password); userRepository.save(user); log.info(user.toString()+" saved to the repo"); return "Saved"; } /** * 登錄方法, 用戶輸入郵箱和密碼, 查詢數據庫檢驗是否有該帳戶,若是有, * 返回原先頁面 ,登錄成功。 * @param email 用戶郵箱 * @param password 用戶密碼 * @param model Spring MVC中的Model,用來儲存通過controller處理後的信息,再由View層渲染 * 獲得前端頁面。 * @return */ @GetMapping(path = "/login") public String login(@RequestParam String email, @RequestParam String password, Model model) { List<User> users = userRepository.findByEmail(email); // 若是數據庫中未查到該帳號: if (users == null) { log.warn("attempting to log in with the non-existed account"); return "該用戶不存在"; } else { User user = users.get(0); if (user.getPassword().equals(password)) { // 若是密碼與郵箱配對成功: model.addAttribute("name", user.getName()); log.warn(user.toString()+ " logged in"); } else { // 若是密碼與郵箱不匹配: model.addAttribute("name", "logging failed"); log.warn(user.toString()+ " failed to log in"); } return "index"; } } /** * 查看全部用戶的註冊信息,按照Spring Boot的設定,以Json的形式輸送給用戶端。 * @return */ @GetMapping(path="/all") public @ResponseBody Iterable<User> getAllUsers() { return userRepository.findAll(); } /** * 域名的根目錄,而後返回的「index」會映射到 * java/resources/templates/index.html文件。 * @param name * @return */ @GetMapping(path="/") public String welcomePage(@RequestParam(name="name", required=false, defaultValue="World") String namel){ return "index"; } }
知識點講解:
@AutoWired
被注有它的註解會被Spring
得知, Spring
會自動爲你注入依賴. 好比上述的userRepository
, Spring
在運行過程當中會經過IoC容器
爲你注入一個UserRepository
的實例給userRepository
. 相關知識點: 依賴注入
、設計模式
.@GetMapping
將使用Get
方法的HTTP
請求映射到被注的方法. 相關知識點: HTTP請求
, HTTP方法
.@RequestParam
將HTTP請求
中用戶傳入的參數映射到變量中括號內指定變量中. 相關知識點: HTTP參數
@ResponseBody
它表示該方法返回的值就是Response
自己, 不需傳遞至View
被渲染, 用戶直接獲得該方法的返回值.其他講解在代碼內的註解中.
在resources/templates/
目錄下建立一個index.html
文件, 它即是咱們應用的入口界面.
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Spring Boot實戰訓練: Spring+Mysql 構建一個簡單的登錄註冊系統</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" href="index.css"> </head> <body> <h2>實例驅動學習之Spring框架: </h2> <p>----Spring Boot+MySQL 構建一個簡單的登錄註冊系統</p><br> <p th:text="'Hello, ' + ${name} + '!'" /> <div class="add"> <h2>註冊新帳號</h2> <form action="/add" method="GET"> 用戶名:<input type="text" name="name"><br> 郵箱:<input type="text" name="email"><br> 密碼:<input type="password" name="password"><br> <input type="submit" value="註冊"> </form> </div> <div class="login"> <h2>登錄已有帳號</h2> <form action="/login" method="GET"> 郵箱:<input type="text" name="email"><br> 密碼:<input type="password" name="password"><br> <input type="submit" value="登錄"> </form> </div> <div class="all"> <h2><a href="/all">查看全部註冊帳號信息</a></h2> </div> </body> </html>
咱們在VSCode的內置命令行工具裏輸入mvn spring-boot:run
, 而後幾秒鐘等待, 運行成功, 能夠用瀏覽器輸入網址localhost:8080
來使用咱們的應用.
[1] 十五分鐘用Spring Boot+MySQL作一個登錄系統
https://zhuanlan.zhihu.com/p/55796334
[2] Spring框架實例學習 完整代碼示例和講解 適合Spring入門學習者