十五分鐘用Spring Boot+MySQL作一個登錄系統

Spring Boot最好的學習方法就是實戰訓練,今天咱們用很短的時間啓動咱們第一個Spring Boot應用,而且鏈接咱們的MySQL數據庫. 我將假設讀者爲幾乎零基礎,在實戰講解中會滲透Spring框架中的一些知識點,並提供相關官方文檔連接, 讓咱們一塊兒在實戰中高效學習。css

在這個實戰學習中, 咱們將使用Spring BootMySQL數據庫構建一個簡單的登錄系統,功能包含註冊帳戶登錄兩個功能,並用Spring Boot官方推薦使用的thymeleaf模板來生成簡單的前端頁面。niudai/Spring-by-example在這個實戰學習中, 咱們將使用Spring BootMySQL數據庫構建一個簡單的登錄系統,功能包含註冊帳戶登錄兩個功能,並用Spring Boot官方推薦使用的thymeleaf模板來生成簡單的前端頁面。html

看完這篇教程,你將作出這樣一個應用:前端

能夠看到上方的"Hello, null!"字樣, null爲當前已登錄的用戶名, 若未登錄, 則顯示爲null.java

下方的註冊新帳戶, 須要填寫用戶名, 郵箱, 密碼, 常規操做, 登錄須要郵箱和密碼, 在最下方有查看全部註冊帳號信息的功能, 點擊以後能夠看到全部已註冊的帳號的所有信息.mysql

看完該文章, 你將學會:git

  1. 使用MySQL shell工具鏈接到MySQL server, 建立一個用戶, 並建立一個數據庫.
  2. 學習在Spring中配置並鏈接到你的MySQL數據庫.
  3. 學習並掌握Jpa的Entity, Repository的使用方法.

好, 咱們開始.github

一、配置MySQL數據庫

第一步咱們須要將MySQL數據庫下載到電腦裏, 下載地址: 下載MySQL完整工具包web

在頁面中點擊紅線框住的部分:spring

點進去, 拉到頁面下方, 點擊紅框部分右側的download:sql

下載後, 按照安裝包提示的步驟操做, 安裝完畢後, 你會得到幾個新應用, 咱們只用其中一個, 它是:

它是MySQL的命令行工具, 咱們用它來操做咱們的MySQL數據庫.

可是咱們不直接點開它, 咱們在Windows自帶的Command Prompt中使用它.

  1. 打開Command Prompt, 輸入:
mysql -u root -p

進入Mysql命令行工具, 會提示你輸入密碼:

輸入在安裝過程當中設置的密碼, 進入mysql命令行工具.

  1. 建立一個MySQL用戶, 在命令行中輸入命令(實際上是SQL語句):
CREATE USER 'niudai'@'localhost' IDENTIFIED BY 'niudai';

這個語句的目的是建立一個用戶名爲'niudai', 登錄密碼爲'niudai'的MySQL數據庫管理員, 用這個帳號能夠管理咱們的數據庫, 也就是說若是你要管理數據庫, 你必需要有這麼一個帳號.

  1. 再輸入以下語句:
CREATE DATABASE springdb;

熟悉SQL語言的同窗應該很熟悉上面這句, 就是建立一個名爲springdb的數據庫, 這個數據庫就是咱們的Spring Boot應用要鏈接的.

  1. 賦予剛建立的用戶名爲"niudai"的用戶管理springdb數據庫的全部權限:
GRANT ALL ON springdb.* TO 'niudai'@'localhost';

二、建立一個Spring Boot應用

做者本人是使用Visual Studio Code進行該應用的開發, 加裝Spring官方提供的VSCode插件, 能夠輕鬆進行開發, 固然若是你喜歡用IDEAEclipse, 或STS也行, 但根據本人體驗, VSCode上的體驗遠超EclipseSTS, 推薦讀者嘗試.

我安裝了全套JavaSpringMaven的擴展, ctrl+shift+P打開命令行, 搜索Spring Initializer命令.

由於咱們用Java語言開發, 因此選擇Java語言:

輸入Group ID, 也就是你的這個應用所屬的羣的名稱, 咱們輸入org.springframework(其實輸什麼都行, 無所謂).

而後輸入咱們的Artifact ID, 就是你這個項目的ID, 我輸入gs-logging-data-mysql(隨便輸, 無所謂).

而後選擇最新Spring Boot版本, 而後選擇以下Spring Boot依賴:

一共四個依賴, 全是Spring Boot官方支持的庫, 知識點講解:

  1. Thymeleaf 是現代服務端的Java模板引擎, 咱們用它來生成HTML頁面.
  2. JPA 是Java Persistence API, 也就是Java持久層API, 它的本質是一套將Java的對象映射到數據庫中的關係表的標準, 而Spring-BootJPA依賴包含一個重要子依賴, 你必定聽過它的名字: Hibernate. 它是JPA的具體實現, 也是Spring Boot的默認JPA實現.官方文檔相關知識點閱讀
  3. MySQL 是用來實現從Java到MySQL鏈接的一箇中間件.
  4. Web 是Spring Boot重要核心組件, 網絡應用的必須品, 它包含了Tomcat容器, Spring MVC等核心組件.

因此咱們也能夠看到Spring Boot其實至關於一個依賴打包器, 好比網絡模塊, 你們都須要Tomcat容器, 也須要Spring MVC框架, 那索性就放到一個包裏, 也就是Web包, 這樣一個依賴就解決了問題.

三、配置application.properties文件

application.properties文件的做用有點相似於pom, 但也不太同樣, pom是管理你應用和其餘庫的依賴關係, 而application.properties則是去設置, 或是配置這些依賴, 是Spring應用的重要組成部分.

Spring Boot官方文檔推薦閱讀

該文件能夠在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

什麼是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框架會得知這個類是一個EntityHibernate會把這個類映射到數據庫中的關係表, 這個關係表的列與User的全部屬性一一對應.

至關於SQL語言中的:

CREATE TABLE User(id int, name varchar(255), email varchar(255), password varchar(255));

五、建立UserRepository

若是說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'

相關官方文檔閱讀

六、建立你的UserController

Controller是接受用戶的url請求, 將url映射到某個具體的方法, 處理url請求, 再返回一個Model的東西, 是Spring MVC中的C層.

知識點: Spring MVC中的三層分別是ModelViewController. 當用戶向你的服務器發送了請求後, 好比HTTP請求, Controller先將請求映射到某個方法上, 方法根據該請求進行相應處理, 返回Model, 這個Model能夠被理解成一個抽象的數據模型, 它儲存了網頁必須包含的信息, 可是它不是網頁自己, Model會被送到View層, 也就是用戶界面層, View層將本身自己的模板和Model內部的數據結合成爲完整的一個頁面, 做爲response返還給用戶, 用戶便看到了你的頁面, 可是如今隨着先後端的分離, View層的意義已經不大,做爲後端開發, 主要專一於ModelController.

建立一個文件: 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";
    }


}

知識點講解:

  1. @AutoWired 被注有它的註解會被Spring得知, Spring會自動爲你注入依賴. 好比上述的userRepositorySpring在運行過程當中會經過IoC容器爲你注入一個UserRepository的實例給userRepository. 相關知識點: 依賴注入設計模式.
  2. @GetMapping 將使用Get方法的HTTP請求映射到被注的方法. 相關知識點: HTTP請求HTTP方法.
  3. @RequestParam 將HTTP請求中用戶傳入的參數映射到變量中括號內指定變量中. 相關知識點: HTTP參數
  4. @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>

八、運行咱們的Spring Boot應用

咱們在VSCode的內置命令行工具裏輸入mvn spring-boot:run, 而後幾秒鐘等待, 運行成功, 能夠用瀏覽器輸入網址localhost:8080來使用咱們的應用.

Refer:

[1] 十五分鐘用Spring Boot+MySQL作一個登錄系統

https://zhuanlan.zhihu.com/p/55796334

[2] Spring框架實例學習 完整代碼示例和講解 適合Spring入門學習者

https://github.com/niudai/Spring-by-example

相關文章
相關標籤/搜索