Spring Boot學習筆記(二)簡單CRUD實現

開發配置

依賴包準備java

這裏選用mysql做爲數據庫,須要用到的包有三個,須要將相關依賴寫入pom.xml,以下:mysql

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
  </dependency>
    
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>

數據庫鏈接設定spring

在src/main/resources/application.properties文件中,加入如下配置信息:sql

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.tomcat.max-idle=10
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.min-idle=5
spring.datasource.tomcat.initial-size=5

其中test是數據庫名稱,username和password可自行設置和修改數據庫

實體定義

咱們將要操做的實體很簡單,只有一個id屬性和一個name屬性。定義以下:segmentfault

@Entity
@Table(name="T_USER")
public class User {

    /**
     * 用戶ID
     */
    @Id
    @GeneratedValue
    private int id;
    
    /**
     * 用戶名
     */
    private String name;

    // GETTER和SETTER此處省略...
}

<說明>後端

  1. @Entity註解,代表了這是一個Entity,可使用默認的ORM規則,即class名即爲要更新的數據表名
  2. @Table註解,能夠指定這個Entity要更新的數據表名,也不使用默認的ORM規則。
  3. @Id註解,代表了這個數據表的主鍵ID,這個主鍵能夠是AUTO_INCREMENT類型的數據。

備忘
在測試中,此處的id類型使用Integer會報錯,緣由尚不清楚,使用int則無問題。tomcat

路由設置

以簡單的User對象爲例,咱們來實現一個簡(chou)單(lou)的的CRUD處理restful

Restful風格架構

對於簡單的增刪改查功能,通常的restful接口定義以下:

GET    /user        # 取得user列表
POST   /user        # 提交user
PUT    /user        # 更新user
PATCH  /user        # 更新user(個別屬性)
DELETE /user/:id    # 刪除user

路由設置

對於純數據的Java後端架構來說,MVC中少了View,但M和C還是必不可少的。Model用於管理數據實體及持久化相關的處理,Controller則是整個業務的核心。

首先,對於user的每一個接口,咱們在controller中定義對應請求接收方法:

@RestController
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserService userService;

    @GetMapping("")
    public ResponseEntity<?> getList() {
        return new ResponseEntity<Object>(userService.getUserList(), HttpStatus.OK);
    }
    
    @PostMapping("")
    public ResponseEntity<?> create(@RequestBody User user) {
        return new ResponseEntity<User>(userService.save(user), HttpStatus.CREATED);
    }

    @PatchMapping("")
    public ResponseEntity<?> update(@RequestBody User user) {
        return new ResponseEntity<User>(userService.save(user), HttpStatus.ACCEPTED);
    }
    
    @DeleteMapping("/{id}")
    public ResponseEntity<?> remove(@PathVariable("id") int id) {
        userService.remove(id);
        return new ResponseEntity<User>(HttpStatus.ACCEPTED);
    }
}

<說明>

  1. @RestController註解,代表這個controller專門用於Restful服務,返回值不是傳統的WEB數據。
  2. @RequestMapping註解,代表訪問的相對路徑爲「/user"
  3. @GetMapping、@PostMapping、@PatchMapping和@DeleteMapping分別對應了GET、POST、PATCH和DELETE請求,這四個方法將分別接收對應訪問路徑上對應方法的HTTP請求。它們也可用@RequestMapping(value="", method=RequestMethod.POST(或者GET、PATCH等)來替代。
  4. @PathVariable用於取得訪問路徑中的參數
  5. ResponseEntity用於返回處理結果與錯誤碼

上面經過UserService的調用,實現了user的CRUD操做。Spring經過@Autowired註解,會自動建立UserService的實例。

CRUD操做

經過UserService的相關操做,咱們能夠很容易的對user表進行CRUD操做。代碼以下:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepo;
    
    public Iterable<User> getUserList() {
        return userRepo.findAll();
    }
    
    public User save(User user) {
        return userRepo.save(user);
    }
    
    public void remove(int id) {
        userRepo.delete(id);
    }
}

<說明>

  1. 經過@Service註解,Spring會自動實例化到UserController中
  2. Service中註解了@Autowired的實例userRepo,其實是繼承了CrudRepository的一個接口。Repository在Spring的概念體系中是相似於傳統DAO的實體,一個Repository對應一個數據表的操做。
  3. UserService中使用的findAll、save和delete方法,均是CrudRepository中預約義的方法。

對於UserRepository來說,僅僅是一個簡單的繼承了CrudRepository的接口。代碼以下:

public interface UserRepository extends CrudRepository<User, Integer> {}

關於Repository的說明,能夠看這篇文章pring Boot學習筆記(三)Repository的使用

結果確認

簡單接口測試可以使用POSTMAN進行,結果以下:

取得用戶列表
clipboard.png

插入2條數據
clipboard.png
clipboard.png

取得用戶列表
clipboard.png

更新用戶
clipboard.png

刪除用戶
clipboard.png

取得用戶列表
clipboard.png

待改進事項

目前只是實現了一個簡單的CRUD操做,就這個簡單流程來說,如下幾點尚欠缺:

  1. 返回值須要有結構化的設計
  2. 分頁和排序功能也有欠缺。
  3. 缺乏自動化測試
相關文章
相關標籤/搜索