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中,重啟專案即可
關注公眾號,將會有更多精彩每天送達:
公眾號內有精彩內容,可以提現