Spring Boot+Jpa(MYSQL)做一個登陸注冊系統(前后端數據庫一站式編程)


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

該教學實例在github上, 項目文件地址

在這個實戰學習中, 我們將使用Spring BootMySQL數據庫構建一個簡單的登陸系統,功能包含注冊賬戶登陸兩個功能,並用Spring Boot官方推薦使用的thymeleaf模板來生成簡單的前端頁面。 我們將使用Spring BootMySQL數據庫構建一個簡單的登陸系統,功能包含注冊賬戶登陸兩個功能,並用Spring Boot官方推薦使用的thymeleaf模板來生成簡單的前端頁面。

看完該文章, 你將學會:

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

配置MySQL數據庫

第一步我們需要將MySQL數據庫下載到電腦里, 下載地址: 下載MySQL完整工具包

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

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

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

它是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應用

https://start.spring.io/這是Spring官網的依賴,把你所需要的依賴打包下載到本地,然后用idea打開即可。

 

我們所需要的四個依賴, 全是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. 繼承JpaRepository接口也可以。

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應用

運行成功, 可以用瀏覽器輸入網址localhost:8080來使用我們的應用.

如果端口被占用在配置文件里面輸入

server.port=xxxx 再次啟動就🆗了

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM