目錄

Day 27 - Spring JDBC 的用法(下)- 執行 SELECT SQL

古古

2024/07/27


哈囉大家好,我是古古。

在上一篇文章中,我們有介紹了 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 參數」。

因此在學習 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)。

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

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

操作到這裡,我們其實就完成 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;
    }
}

使用 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;
}

當我們這樣子寫之後,到時候當前端來請求 /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 中,並且填上以下的請求參數:

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

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

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

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

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

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

query() 方法的用法總結 #

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

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

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

總結 #

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

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

補充:本文是擷取自我開設的線上課程 Java 工程師必備!Spring Boot 零基礎入門 的內容,如果你想了解更多的 Spring Boot 的用法,歡迎參考課程簡介 (輸入折扣碼「HH202504KU」即可享 85 折優惠)。