1. 程式人生 > >spring boot學習筆記(三):controller用法及資料庫操作

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,如果各位發現哪裡有問題,希望大家給我留言指出,謝謝!