1. 程式人生 > >02) SpringBoot 中Controller的使用、資料庫操作、事物管理、修改banner

02) SpringBoot 中Controller的使用、資料庫操作、事物管理、修改banner

1 Controller的使用

  特點:程式設計技巧和SpringMVC幾乎完全一樣

  注意:@RestController = @Controller + @ResponseBody

  注意:讀取路徑引數和請求引數是利用的不通的註解實現,其中請求引數是可以設定預設值的

package cn.xinagxu.girl02.controller;

import cn.xinagxu.girl02.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@RestController
public class HelloController {

    @Value("${character}")
    private String character;
    @Value("${age}")
    private Integer age;
    @Value("${content}")
    private String content;

    @Autowired
    private Student student;

    @RequestMapping(value = "/")
    public String hello() {
//        return "Hello World!" + "性格:" + character + " 年齡:" + age + " 詳細資訊為:" + content;
        return student.toString();
    }

    /**
     * GET請求
     * @return
     */
    @GetMapping(value = "/param")
    public String param02() {
        return "測試GET請求,@GetMapping是GET請求的專屬";
    }

    /**
     * POST請求
     * @return
     */
    @PostMapping(value = "/param")
    public String param03() {
        return "測試POST請求,@PostMapping是POST請求的專屬";
    }

    /**
     * 獲取GET請求路徑中的引數
     * @param id
     * @return
     */
    @GetMapping(value = "/param/{id}")
    public String param04(@PathVariable("id") Integer id) {
        return "獲取到的ID資料為:" + id;
    }

    /**
     * 獲取GET請求路徑的引數
     * @param id
     * @return
     */
    @GetMapping(value = "/{id}/param")
    public String param05(@PathVariable("id") Integer id) {
        return "獲取到的ID資料為:" + id;
    }

    /**
     * 獲取POST路徑中的引數
     * @param id
     * @return
     */
    @PostMapping(value = "/param/{id}")
    public String param06(@PathVariable("id") Integer id) {
        return "從POST路徑中獲取到的ID資料為:" + id;
    }


    /**
     * 獲取GET請求的請求引數(這種寫法必須寫上引數,引數可以為空)
     * @param id
     * @return
     */
    @GetMapping(value = "/requestParam")
    public String param07(@RequestParam("id") Integer id) {
        return "從GET請求中獲取到的請求引數為:" + id;

    }

    /**
     * 獲取GET請求引數(這種寫法支援預設值)
     * @param id
     * @return
     */
    @GetMapping(value = "/requestParam/2")
    public String param08(@RequestParam(value = "id", required = false, defaultValue = "0") Integer id) {
        return "從GET請求中獲取到的引數為(支援預設引數): " + id;
    }
//    注意:POST請求的請求引數和GET請求的請求引數的獲取方式完全一樣,在這裡就不在做演示



}

2 資料庫操作

  2.1 前提準備

    安裝好MySQL資料庫

    在pom檔案中引入MySQL的驅動包    

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

    在pom檔案中引入jpa

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

  2.2 建立一個實體類

    利用@Entity標註這個類是一個實體類

    利用@Id標註這個欄位是主鍵

    利用@GeneratedValue標註這個欄位是自增的

package cn.xiangxu.cloud.springCloud01.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;

/**
 * 學生實體類
 */
@Entity
public class Student {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    private String address;
    private String subject;
    private String description;

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public Student() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

    注意:實體的屬性名不能和資料庫的某些關鍵字衝突,如:不能用desc作為屬性名

  3.3 建立一個與實體類對應的持久層介面

    該介面必須繼承於JpaRepository,其中JpaRepository的第一個引數是對應的實體類名,第二個引數是對應的實體類標有@Id註解的那個屬性

package cn.xiangxu.cloud.springCloud01.repository;

import cn.xiangxu.cloud.springCloud01.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;

//public interface StudentRepository extends JpaRepository<Student, Integer> {
//}
public interface StudentRepository extends JpaRepository<Student, Integer> {

}

  3.4 資料庫配置檔案

    

server:
  context-path: /student
  port: 8888

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot
    username: dev
    password: 182838
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

  3.4 測試一下

    完成上述步驟後就可以啟動專案,如果在資料庫中建立了一個與實體類名一直的表,就說明資料庫環境搭建成功

    注意:如果實體類名採用的是駝峰命名法,那麼建立的表明會將大寫字母轉化成下劃線,但是首字母會轉化成小寫字母

  3.5 在控制層呼叫持久層

    注意:應該在服務層呼叫控制層,因為這裡的例子太簡單了,所以直接跳過服務層在控制層呼叫持久層

    

package cn.xiangxu.cloud.springCloud01.controller;

import cn.xiangxu.cloud.springCloud01.entity.Student;
import cn.xiangxu.cloud.springCloud01.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StudentController {
    @Autowired
    private StudentRepository studentRepository;

    @GetMapping(value = "/{id}")
    public Student findById(@PathVariable("id") Integer id) {
        return studentRepository.findOne(id);
    }
}

  3.6 在控制層實現資料的增刪改查

    注意:雖然我們在持久層介面中沒有定義任何方法,但是我們的介面繼承了JpaRepository,所以我們可以用持久層介面來依賴注入一個物件,從而用一些預設的方法來實現資料庫操作,例如:save(持久層物件)    delete(主鍵欄位)   findAll()  findOne(主鍵欄位)  

    注意:save方法可以實現插入和修改操作

    注意:PUT請求時的特別設定

    注意:我採用的是postMan工具進行測試

    

package cn.xiangxu.cloud.springCloud01.controller;

import cn.xiangxu.cloud.springCloud01.entity.Student;
import cn.xiangxu.cloud.springCloud01.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class StudentController {
    @Autowired
    private StudentRepository studentRepository;

    @PostMapping(value = "/insertOne")
    public Student inserOne(@RequestParam("name") String name,
                         @RequestParam("address") String address,
                         @RequestParam("subject") String subject,
                         @RequestParam("description") String description) {
//        從前端獲取到的資料應該先做一下三個檢查
//        檢查變數型別
//        檢查變數長度
//        檢查變數格式
        Student student = new Student();
        student.setName(name);
        student.setAddress(address);
        student.setSubject(subject);
        student.setDescription(description);

        return studentRepository.save(student);

    }


    /**
     * 根據ID刪除指定的記錄
     * @param id
     */
    @DeleteMapping(value = "/deleteById/{id}")
    public void deleteById(@PathVariable("id") Integer id) {
        studentRepository.delete(id);
    }

    /**
     * 根據ID修改制定學生的資訊
     * @param id
     * @param name
     * @param address
     * @param subject
     * @param description
     * @return
     */
    @PutMapping(value = "updateById/{id}")
    public Student updateById(@PathVariable("id") Integer id,
                           @RequestParam("name") String name,
                           @RequestParam(value = "address", required = false, defaultValue = "重慶市大足區") String address,
                           @RequestParam(value = "subject", required = false, defaultValue = "Java") String subject,
                           @RequestParam(value = "description", required = false, defaultValue = "大足是個好地方") String description) {
        Student student = new Student();
        student.setId(id);
        student.setName(name);
        student.setAddress(address);
        student.setSubject(subject);
        student.setDescription(description);

        return studentRepository.save(student);
    }
//    注意:put請求時body中設定:x-www-form-urlencoded

    /**
     * 查詢所有的學生資訊
     * @return
     */
    @GetMapping(value = "/findAll")
    public List<Student> findAllStudent() {
        return studentRepository.findAll();
    }

    /**
     * 根據學生ID查詢單個的學生資訊
     * @param id
     * @return
     */
    @GetMapping(value = "/findById/{id}")
    public Student findById(@PathVariable("id") Integer id) {
        return studentRepository.findOne(id);
    }
}

  3.7 自定義查詢函式

    字需要在持久層介面中定義好函式就行啦

    注意:函式的名字使用規則的,比如你要按照name欄位查詢,那麼函式名就必須是findByName

      

  3.8 在除查詢意外的操作都應該有事物管理

    只需在相應的方法前新增@Transactional註解就行啦

      

原始碼:點選前往

4 修改banner

  4.1 在springboot專案的resources下建立一個banner.txt檔案

  4.2 開啟連線:點選前往

     

  4.3 將生成的字元複製到banner.txt中,重啟專案即可

    

關注公眾號,將會有更多精彩每天送達:

公眾號內有精彩內容,可以提現