1. 程式人生 > 實用技巧 >【平臺開發】— 5.後端:程式碼分層

【平臺開發】— 5.後端:程式碼分層

資料庫準備完事兒,現在可以擼後端程式碼了。

現在想要探索前後端如何互動,得後端返回出資料才行,既然如此,那就先來擼一個返回使用者資訊。
然後就可以判斷前端傳來的使用者名稱和密碼是不是存在,存在的話就可以登入(PS:這裡僅僅以學習目的,並不是說真正的登入是這麼實現)。

首先,熟悉下後端程式碼的分層。

一、pojo

實體層,用來寫實體類,比如使用者User,它有很多個屬性,比如idusername等等,與上篇設計的資料庫表字段對應。
注意@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的倒序。