【平臺開發】— 5.後端:程式碼分層
阿新 • • 發佈:2020-07-14
資料庫準備完事兒,現在可以擼後端程式碼了。
現在想要探索前後端如何互動,得後端返回出資料才行,既然如此,那就先來擼一個返回使用者資訊。
然後就可以判斷前端傳來的使用者名稱和密碼是不是存在,存在的話就可以登入(PS:這裡僅僅以學習目的,並不是說真正的登入是這麼實現)。
首先,熟悉下後端程式碼的分層。
一、pojo
實體層,用來寫實體類,比如使用者User
,它有很多個屬性,比如id
,username
等等,與上篇設計的資料庫表字段對應。
注意@Data
這個註解,可以不用寫set()
、get()
、tostring()
方法了,省去了不少功夫,而且程式碼也更簡潔。
記得新增依賴
,和在idea裡安裝lombok
package com.mock.platform.pojo; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; import javax.persistence.*; import java.util.Date; @Entity @Table(name = "user") @JsonIgnoreProperties({"handler", "hibernateLazyInitializer"}) @Data public class User { @Id //宣告一個欄位“id”為資料庫表的主鍵 @GeneratedValue(strategy = GenerationType.AUTO) //標註主鍵的生成策略,通過strategy 屬性指定 @Column(name = "id") //被標註欄位在資料庫表中所對應欄位的名稱 private int id; //使用者id private String username; //使用者名稱稱 private String password; //密碼 private Date createTime; //建立時間 // public int getId() { // return id; // } // public void setId(int id) { // this.id = id; // } // public String getUsername() { // return username; // } // public void setUsername(String username) { // this.username = username;
二、dao
DAO層,全稱Data Access Object,負責與資料庫打交道。
這個包下面則是用來寫dao檔案,UserDAO
類繼承JpaRepository
,就提供了CRUD和分頁 的各種常見功能。
JpaRepository<User, Integer>
,引數分別是實體類
,和這個實體類id的型別
。
package com.mock.platform.dao; import com.mock.platform.pojo.User; import org.springframework.data.jpa.repository.JpaRepository; /** * UserDAO類繼承JpaRepository,就提供了CRUD和分頁 的各種常見功能。 * JpaRepository<User, Integer>,引數分別是實體類,和這個實體類id的型別。 */ public interface UserDAO extends JpaRepository<User, Integer> { }
三、service
業務邏輯層,主要的業務邏輯就是在這裡實現了,所以說基本業務需求都更改這個層。
比如我實現一個方法用來查詢使用者資訊。
package com.mock.platform.service;
import com.mock.platform.dao.UserDAO;
import com.mock.platform.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.util.List;
@Service //標記這是一個service類
public class UserService {
@Autowired //自動裝配UserDAO物件
UserDAO userDAO;
public List<User> userList() {
// Sort 物件,表示通過 id 倒排序
Sort sort = Sort.by(Sort.Direction.DESC, "id");
// 通過 categoryDAO進行查詢
return userDAO.findAll(sort);
}
}
四、controller
這層通常用來控制業務邏輯,但是具體的業務邏輯並不在這裡實現,而是通過呼叫service層裡的方法。
比如我這裡就是接收到前端的請求後,返回使用者資訊。
package com.mock.platform.controller;
import com.mock.platform.pojo.User;
import com.mock.platform.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController //標記這是控制器,下面每個方法的返回值都會直接轉換成json資料格式
public class UserController {
@Autowired //自動裝配 CategoryService
UserService userService;
@GetMapping("/users") //當訪問users,會獲取所有的User物件集合,並返回。RestController會自動轉成json給瀏覽器
public List<User> userList() throws Exception {
return userService.userList();
}
}
五、properties
上面基本把邏輯都寫好了,現在還要在properties裡配置好資料來源,這樣整個服務才可以使用。
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/my_platform?characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto = none
#上下文地址為 my_platform
server.servlet.context-path=/my_platform
#jpa對實體類的預設欄位會把駝峰命名的屬性,轉換為欄位名的時候自動加上下劃線。 這個配置的作用就是去掉下劃線
#比如屬性名稱是 createDate, jpa 預設轉換為欄位名 create_Date。 有了這個配置之後,就會轉換為同名欄位 createDate
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#顯示 hibernate 執行的sql語句。 這個在上線之後,應該是關掉的,因為大量的 控制檯輸出會嚴重影響系統性能,現在除錯用
spring.jpa.show-sql=true
為了方便,我先在資料庫插入了3條使用者資訊:
六、驗證
到了驗證的時候了,先啟動後端服務。
接下來,我用postman去請求controller裡暴露出來的介面,看看是不是正確的返回資料。
資料正確返回,按照id的倒序。