個人網站好讀版:Spring Boot 零基礎入門 系列文章
哈囉大家好,我是古古。
在上一篇文章中,我們有介紹了 Spring JDBC 中的 update()
的用法,了解要如何透過 update()
方法,去執行 INSERT、UPDATE、DELETE 這三種 SQL 語法。
那麼這篇文昭,我們就會接著來介紹 Spring JDBC 中的另一個方法,也就是 query()
的用法,了解要如何透過 query()
方法去執行 SELECT SQL。
在 Spring JDBC 中,query()
方法的用途是「執行 SELECT SQL 語法」,因此我們就可以使用 query()
方法,去查詢資料庫中的數據。
而 query()
的用法其實和前一篇文章我們所介紹的 update()
方法非常相似,前兩個參數都和 update()
方法一樣,都是先放入「想要執行的 SQL 語法」,接著再放入「動態決定 SQL 變數的 map 參數」。
因此在學習 query()
的用法之前,建議大家一定要先學會 update()
的用法,這樣子在學習 query()
方法時才會更好上手。
不過 query()
方法特別的地方,就在於他的第三個參數 RowMapper,RowMapper 可以說是影響 query()
方法的核心參數,因此接下來我們就來介紹一下,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 的實作中,我們的目的是「將資料庫中所查詢出來的數據,轉換成是一個 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;
}
}
在實作完上述的 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 筆數據,分別是:
而這就和 IntelliJ 中所呈現的 student table 的數據,是一模一樣的。
所以這就表示,我們就成功的透過了 Spring JDBC 的 query()
方法,在 Spring Boot 中執行 SELECT SQL 語法,從資料庫中查詢數據出來了!因此後續我們就可以透過這種寫法,從資料庫中查詢想要的數據出來了。
補充:除了上述最基礎的
query()
的用法之外,大家也可以試試看像上一篇文章一樣,去修改 SQL 語法、以及在 map 參數中添加相關的變數的值,這樣就可以根據不同的查詢參數,從資料庫中查詢出指定的數據了。
所以總結來說,如果想要使用 query()
方法,在 Spring Boot 中執行 SELECT SQL 語法的話,那麼就只要在 query()
方法中,按照順序填入以下三個參數:
這樣子就可以在 Spring Boot 中,去執行你想要執行的 SELECT SQL 語法了!
在這篇文章中,我們介紹了 Spring JDBC 中的 query()
的基本用法,了解要如何透過 query()
方法,在 Spring Boot 程式中執行 SELECT SQL 語法,進而從資料庫中查詢數據出來,最終再返回給前端。
在了解了 Spring JDBC 中的兩大核心用法 update()
和 query()
之後,基本上就可以涵蓋大多數的日常開發了,因此下一篇文章,我們會延伸去介紹軟體工程中的一個很重要的概念,也就是「MVC 架構模式」,那我們就下一篇文章見啦!
補充:本文是擷取自我開設的線上課程 Java 工程師必備!Spring Boot 零基礎入門 的內容,如果你想了解更多的 Spring Boot 的用法,歡迎參考課程簡介。