spring boot學習筆記(三):controller用法及資料庫操作
一、controller用法
1、@controller和@RestController註解的區別
@controller處理http請求,頁面展示需要配合thymeleaf模板使用。
示例:
a、首先,在pom檔案新增thymeleaf模板依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
b、新建GirConerllr:
package com.springboot.gril.controller;
import java.util.List;
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 .RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.springboot.gril.entity.Girl;
import com.springboot.gril.repository.GirlRepository;
@Controller
public class GirlController {
@Autowired
private GirlRepository girlRepository;
@RequestMapping(value = "/test" , method = RequestMethod.GET)
public String test(){
return "index";
}
}
c、在resource/templates下建立index.html檔案,這裡的html檔名必須跟controller的方法返回的的名稱一致:
index.html:
<h1>
Hello Spring Boot!
</h1>
d、啟動專案,測試效果:
這裡thymeleaf模板的使用我也不是很熟練,也不是本篇文章的重點內容,我就不做詳細的介紹,想做深入瞭解的可以檢視官方文件。另外,現在專案趨向於前後端分離,後端一般給前端提供介面,返回json串,因此這裡推薦使用下面介紹的@RestController註解。
2、@RestController註解
@RestController註解實際上是一個組合註解,相當於@controller和@ResponseBody配合使用。後面的內容都是使用的@RestController註解,在這裡就不單獨舉例子講解。
3、多個路徑指向同一個方法
實現多個路徑指向同一個方法,只需在@RequestMapping的value中以集合的方式:
package com.springboot.gril.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.springboot.gril.entity.Girl;
import com.springboot.gril.repository.GirlRepository;
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
@RequestMapping(value = {"/hello", "/hi"}, method = RequestMethod.GET)
public String hello(){
ren "Hello Spring Boot";
}
}
啟動專案測試:
在專案啟動的時候我們就可以看到兩個地址對映到同一個方法上:
通過瀏覽器訪問:
4、獲取url中引數
- @PathVariable註解方式獲取
- @RequestParam註解方式獲取
package com.springboot.gril.controller;
import java.util.List;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.springboot.gril.entity.Girl;
import com.springboot.gril.repository.GirlRepository;
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
@RequestMapping(value = {"/hello", "/hi"}, method = RequestMethod.GET)
public String hello(){
return "Hello Spring Boot";
}
@RequestMapping(value = "/getParamOne/{id}", method = RequestMethod.GET)
public String getParamOne(@PathVariable("id") Integer id){
return "方式一——傳入引數為:" + id;
}
@RequestMapping(value = "/getParamTwo", method = RequestMethod.GET)
public String getParamTwo(@RequestParam("id") Integer myId){
return "方式二——傳入引數為:" + myId;
}
}
那麼這兩種方式有什麼區別呢?
首先我們介紹一下我們@RequestParam這種方式。我們一般習慣在url後通過”?+引數名稱 + = + 引數名稱”的方式傳遞引數,@RequestParam就是獲取這種方式傳遞的引數。
這裡需要注意一點是,url後面的引數名稱必須跟java程式碼中@RequestParam(“id”)後面括號中的名稱保持一致。
相信有人會注意到,用這種方式時,如果不傳入id,訪問該方法就會報錯,或者不給id值,後臺就會是null。那麼,如果我們希望我們在沒有傳入引數的時候可以不用傳入id的值,並且給id一個預設值要怎麼做呢?這裡只需修改@RequestParam內容既可。
@RequestMapping(value = "/getParamTwo", method = RequestMethod.GET)
public String getParamTwo(@RequestParam(value = "id", required = false, defaultValue = "0")
Integer myId){
return "方式二——傳入引數為:" + myId;
}
至於@PathVariable方式獲取引數則比較簡潔一些,我們不需要在url後加上引數名、引數值,只需按照方法上的註解方式輸入,例如上面的為@RequestMapping(value = “/getParamOne/{id}”, method = RequestMethod.GET)
,那麼我們在地址中輸入http://localhost:8080/getParamOne/111,後臺就可以後臺就可們傳到我們傳入的111
這裡要注意的是,在Java程式碼中@RequestMapping和@PathVariable註解中的引數名稱必須一致。
另外,位址列輸入訪問方法跟引數順序需同java註解中保持一致,比如,如果在java中註解方式是@RequestMapping(value = “/{id}/getParamOne”, method = RequestMethod.GET),則位址列中輸入需要是http://localhost:8080/111/getParamOne。
二、資料庫操作
spring boot對資料庫的操作比較簡單,下面開始簡單介紹一下通過spring boot操作資料庫,以mysql資料庫為例。
首先,需在pom檔案中引入相關依賴
<dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
在application.yml檔案中新增連線資料庫的相關配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dbgirl
username: root
password: root
jpa:
show-sql: true
hibernate:
ddl-auto: create
然後,新建一個Girl實體
package com.springboot.gril.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Girl {
@Id
@GeneratedValue
private Integer id;
private String cupSize;
private Integer age;
public Girl() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCupSize() {
return cupSize;
}
public void setCupSize(String cupSize) {
this.cupSize = cupSize;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
@Entity註解標明該類是一個實體類,對應資料庫中的一個表
@Id
宣告主鍵id
@GeneratedValue id自增
另外,在實體類中需要新增無參的構造方法,否則在操作資料庫是會出問題。
在資料庫中建立對應的資料庫,我這裡是dbgirl,啟動專案,我們會發現在資料庫中自動幫我們建立了一個girl的表,欄位跟我們建立的實體對應。原因是因為applicatio.yml中的配置
這句話的意思是,我們在每次啟動專案時,都會自動幫我們建立對應的表,如果這個表存在的會先刪除它,然後重新建立(表中有資料也會刪除),所以,我們常用的配置是把create改成update。update表明,專案第一次啟動時,也會建立相應的表,但是後面啟動時不會刪除表。
這裡還有其它的幾個配置屬性:
create-drop:應用停掉的時候會刪除表;
none:不做任何操作;
validate:會驗證類跟表中的屬性是否一致,不一致會報錯;
有興趣的朋友可以修改各個屬性實際測試一下。
下面,我們來看一下如何操作資料庫裡面的資料:
新建一個GirlRepository介面,繼承JpaRepository介面
package com.springboot.gril.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.springboot.gril.entity.Girl;
public interface GirlRepository extends JpaRepository<Girl, Integer>{
}
這裡可以看到,我並沒有在GirlRepository 中寫任何的方法。
然後在controller中引用GirlRepository :
@Autowired
private GirlRepository girlRepository;
這裡由於邏輯很簡單,所以我並沒有新建server,實際開發中我們是會建一個server層的,我這裡就省去了。
a、查詢所有資料
在controller中建立對應方法
@RequestMapping(value = "/girlList", method = RequestMethod.GET)
public List<Girl> findAll(){
return girlRepository.findAll();
}
啟動專案,測試效果:
前面有說過,@RestController方式,返回的是json串,這裡也驗證了這一點。
然後我們看一下資料庫的資料:
b、根據id查詢
在controller中建立對應方法
@RequestMapping(value = "/findGirlByID/{id}", method = RequestMethod.GET)
public Girl findGirlByID(@PathVariable("id") Integer id){
return girlRepository.findOne(id);
}
測試驗證:
c、刪除操作
在controller中建立對應方法
@RequestMapping(value = "/delGirlByID/{id}", method = RequestMethod.GET)
public void delGirlByID(@PathVariable("id") Integer id){
girlRepository.delete(id);
}
delete方法沒有返回值,執行後檢視資料庫資料:
可以看到,id為1的資料已經被刪除了。
c、新增操作
在controller中建立對應方法
@RequestMapping(value = "/addGirl", method = RequestMethod.GET)
public Girl addGirl(){
Girl girl = new Girl();
girl.setCupSize("F");
girl.setAge(26);
return girlRepository.save(girl);
}
測試結果:
可以看到,資料已經插入到資料庫中了。
e、修改操作
我們現在將id為3的資料年齡修改為30.
@RequestMapping(value = "/updateGirl/{id}", method = RequestMethod.GET)
public Girl updateGirl(@PathVariable("id") Integer id){
Girl girl = new Girl();
girl.setId(id);
girl.setAge(30);
girl.setCupSize("F");
return girlRepository.save(girl);
}
測試結果:
這裡介紹了spring boot對資料庫的簡單操作,下一篇將會介紹一些稍複雜的操作。
最後,我也是初學spring boot,如果各位發現哪裡有問題,希望大家給我留言指出,謝謝!