iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
Software Development

Spring Boot 零基礎入門系列 第 27

Spring Boot 零基礎入門 (27) - Spring JDBC 的用法(下)- 執行 SELECT SQL

  • 分享至 

  • xImage
  •  

個人網站好讀版:Spring Boot 零基礎入門 系列文章

哈囉大家好,我是古古。

在上一篇文章中,我們有介紹了 Spring JDBC 中的 update() 的用法,了解要如何透過 update() 方法,去執行 INSERT、UPDATE、DELETE 這三種 SQL 語法。

那麼這篇文昭,我們就會接著來介紹 Spring JDBC 中的另一個方法,也就是 query() 的用法,了解要如何透過 query() 方法去執行 SELECT SQL。

query() 方法的用法


在 Spring JDBC 中,query() 方法的用途是「執行 SELECT SQL 語法」,因此我們就可以使用 query() 方法,去查詢資料庫中的數據。

query() 的用法其實和前一篇文章我們所介紹的 update() 方法非常相似,前兩個參數都和 update() 方法一樣,都是先放入「想要執行的 SQL 語法」,接著再放入「動態決定 SQL 變數的 map 參數」。

27-1.png

因此在學習 query() 的用法之前,建議大家一定要先學會 update() 的用法,這樣子在學習 query() 方法時才會更好上手。

不過 query() 方法特別的地方,就在於他的第三個參數 RowMapper,RowMapper 可以說是影響 query() 方法的核心參數,因此接下來我們就來介紹一下,RowMapper 的用途為何、以及要如何實作 RowMapper。

RowMapper 的用途

query() 方法中的第三個參數 RowMapper,他的用途是「將資料庫查詢出來的數據,轉換成是 Java object(物件)」。

舉例來說,我們可以創建一個新的 class,名字叫做 StudentRowMapper,並且讓這個 class 去 implements RowMapper interface(此處要注意 implements 的是 org.springframework.jdbc.core.RowMapper 底下的 RowMapper,要小心不要選到其他的 RowMapper)。

27-2.png

讓 StudentRowMapper 去 implements RowMapper interface 之後,接著我們可以在這個 class 中點擊右鍵,然後選擇「Generate…」,並且選擇「Implement Methods」。

27-3.png

27-4.png

然後選擇實作 mapRow() 這個方法,接著按下 OK 鍵。

27-5.png

操作到這裡,我們其實就完成 RowMapper 的實作雛形了!因此接下來我們只要實作剛剛所生成的
mapRow() 方法,就可以將資料庫中查詢出來的數據,轉換成 Java 物件,最後再返回給前端了。

實作 RowMapper

在這個 RowMapper 的實作中,我們的目的是「將資料庫中所查詢出來的數據,轉換成是一個 Java 物件」,因此我們的目標,就是要提取出下面這條 SQL 語法中的 id 和 name 的欄位的值,並且將他轉換成 Student 物件中的 id 和 name 變數。

SELECT id, name FROM student

所以在 StudentRowMapper 中,我們可以依照下面的方式來實作 mapRow() 方法,這樣子就可以將資料庫中查詢出來的 id 和 name 的欄位,轉換成是 Student 物件中的 id 和 name 變數的值了。

public class StudentRowMapper implements RowMapper<Student> {

    @Override
    public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
        Student student = new Student();
        student.setId(rs.getInt("id"));
        student.setName(rs.getString("name"));
        return student;
    }
}

27-6.png

使用 query() 方法查詢數據


在實作完上述的 StudentRowMapper 之後,接著我們就可以回到 StudentController,並且就可以在 StudentController 裡,使用 query() 方法去執行 SELECT SQL,進而從資料庫中查詢數據出來了。

所以我們可以在 StudentController 中,實作下列的程式:

@RequestMapping("/getStudents")
public List<Student> query() {
    
    String sql = "SELECT id, name FROM student";
    
    Map<String, Object> map = new HashMap<>();
    
    StudentRowMapper rowMapper = new StudentRowMapper();
    
    List<Student> list = namedParameterJdbcTemplate.query(sql, map,
rowMapper);

    return list;
}

27-7.png

當我們這樣子寫之後,到時候當前端來請求 /getStudents 這個 API 時,Spring Boot 程式就會去執行第 34~45 行的程式,而當 Spring Boot 執行到第 42 行程式時,就會使用 query() 方法去執行 "SELECT id, name FROM student" 的 SQL 語法,從資料庫中的 student table 中查詢數據出來,並且將查詢出來的 Student 數據,儲存在第 42 行的 List<Student> list 的變數中,最終再將這些數據返回給前端。

因此透過這樣的實作,就可以達到「在 Spring Boot 中查詢資料庫中的數據」的效果了!

實際測試

完成上述的程式之後,我們可以運行這個 Spring Boot 程式,來測試一下效果。

成功運行 Spring Boot 程式之後,接著我們可以回到 API Tester 中,並且填上以下的請求參數:

27-8.png

填寫完畢之後,就按下右側的 Send 鍵,去發起一個 Http 請求。

而當請求成功之後,這時候往下拉的話,在下方的 response body 區塊中,就可以看到 Spring Boot 程式返回了「資料庫中的所有學生數據」給前端,因此在這裡就呈現了 3 筆數據,分別是:

  • id 為 1 的 Judy
  • id 為 3 的 John
  • id 為 4 的 Bob

27-9.png

而這就和 IntelliJ 中所呈現的 student table 的數據,是一模一樣的。

27-10.png

所以這就表示,我們就成功的透過了 Spring JDBC 的 query() 方法,在 Spring Boot 中執行 SELECT SQL 語法,從資料庫中查詢數據出來了!因此後續我們就可以透過這種寫法,從資料庫中查詢想要的數據出來了。

補充:除了上述最基礎的 query() 的用法之外,大家也可以試試看像上一篇文章一樣,去修改 SQL 語法、以及在 map 參數中添加相關的變數的值,這樣就可以根據不同的查詢參數,從資料庫中查詢出指定的數據了。

query() 方法的用法總結


所以總結來說,如果想要使用 query() 方法,在 Spring Boot 中執行 SELECT SQL 語法的話,那麼就只要在 query() 方法中,按照順序填入以下三個參數:

  • sql 參數: 放想要執行的 SQL 語法
  • map 參數: 動態的決定 SQL 變數中的值
  • rowMapper 參數: 將資料庫中查詢出來的數據,轉換成 Java object(物件)

27-11.png

這樣子就可以在 Spring Boot 中,去執行你想要執行的 SELECT SQL 語法了!

總結


在這篇文章中,我們介紹了 Spring JDBC 中的 query() 的基本用法,了解要如何透過 query() 方法,在 Spring Boot 程式中執行 SELECT SQL 語法,進而從資料庫中查詢數據出來,最終再返回給前端。

在了解了 Spring JDBC 中的兩大核心用法 update()query() 之後,基本上就可以涵蓋大多數的日常開發了,因此下一篇文章,我們會延伸去介紹軟體工程中的一個很重要的概念,也就是「MVC 架構模式」,那我們就下一篇文章見啦!

補充:本文是擷取自我開設的線上課程 Java 工程師必備!Spring Boot 零基礎入門 的內容,如果你想了解更多的 Spring Boot 的用法,歡迎參考課程簡介。


上一篇
Spring Boot 零基礎入門 (26) - Spring JDBC 的用法(上)- 執行 INSERT、UPDATE、DELETE SQL
下一篇
Spring Boot 零基礎入門 (28) - MVC 架構模式 - Controller-Service-Dao 三層式架構
系列文
Spring Boot 零基礎入門30
.

尚未有邦友留言

立即登入留言