iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

在 JPQL 中較常的操作就是查詢(SELECT),而比較少會直接透過 JPQL 進行 UPDATE 的操作。如果我們需要 INSERTUPDATE 資料,通常會使用 Spring Data JPA 的 save 方法來儲存資料。

延續我們昨天的實作,今天我們試著將資料新增置資料庫內:
情境二、假設這學期的期中考已經結束了,老師想要把學生的成績歸檔。
假設老師是根據學號來將學生的成績歸檔,我們首先會先需要一個以學號為查詢條件查詢的 JPQL,用於取得學生資料,以確保資料庫中存在該學生的基本資料:

@Query(value = "SELECT * FROM education.dbo.student_information WHERE si_serial_number =:serialNumber", nativeQuery = true)
StudentInformation getStudentBySerialNumber(
        @Param("serialNumber") String serialNumber);

nativeQuery = true 表示使用原生 SQL

假設透過上述查詢語法成功查詢到某個學生的資料,我們才能將考試成績建立至學生成績的資料表內,否則則不存入:

StudentInformation studentInformation = studentInformationRepository.getStudentBySerialNumber(serialNumber);

if(studentInformation != null){
    StudentScores ss = new StudentScores();
    ss.setSsSiId(studentInformation.getSiId());
    ss.setSsExamId(studentScore.getExamId());
    ss.setSsSubject(studentScore.getSubject());
    ss.setSsScore(studentScore.getScore());

    studentScoresRepository.saveAndFlush(ss);
}

在儲存階段想稍微提到一個我認為蠻重要的概念,當我們的 Repository 繼承了 JpaRepository 時,它提供了我們 sava()saveAndFlush() 的方法讓我們儲存 entity。雖然開發者多數都知道有這兩種方法進行資料儲存,但我發現好像不是所有人都了解這兩個方法的差異性:

  • save方法,會將儲存的結果保留在記憶體中,不會立即將結果同步回資料庫內,除非在save方法後呼叫了flush方法,才會將資料寫回資料庫中。
  • saveAndFlush方法,將儲存的結果保留在記憶體後,隨即將資料同步至資料庫內。

完整範例如下:
Controller

@RequestMapping(value = "/setStudentScores", method = RequestMethod.GET)
public String setStudentScores(
        @RequestParam(value = "serialNumber", required = true) String serialNumber,
        @RequestParam(value = "examId", required = true) String examId,
        @RequestParam(value = "subject", required = true) String subject,
        @RequestParam(value = "score", required = true) String score) {
    try {

        StudentScore studentScore = new StudentScore();
        studentScore.setExamId(examId);
        studentScore.setSubject(subject);
        studentScore.setScore(score);
        int result = studentService.saveStudentScores(serialNumber, studentScore);
        if (result == 0) {
            return "資料儲存成功";
        }
        return "查無此學生資料";
    } catch (Exception exception) {
        return "發生錯誤,無法儲存資料";
    }

Service

public int saveStudentScores(String serialNumber, StudentScore studentScore){

    StudentInformation studentInformation = studentInformationRepository.getStudentBySerialNumber(serialNumber);

    if(studentInformation != null){
        StudentScores ss = new StudentScores();
        ss.setSsSiId(studentInformation.getSiId());
        ss.setSsExamId(studentScore.getExamId());
        ss.setSsSubject(studentScore.getSubject());
        ss.setSsScore(studentScore.getScore());

        studentScoresRepository.saveAndFlush(ss);
        return 0;
    }
    return 1;
}

Repository

@Query(value = "SELECT * FROM education.dbo.student_information WHERE si_serial_number =:serialNumber", nativeQuery = true)
StudentInformation getStudentBySerialNumber(
        @Param("serialNumber") String serialNumber);

透過 Postman 發 API 查詢結果如下:
https://ithelp.ithome.com.tw/upload/images/20241003/20168753zgaVt3Q6qe.jpg

https://ithelp.ithome.com.tw/upload/images/20241003/20168753v4AGS6B7Nj.jpg


上一篇
Day18 - Spring Data JPA (3)
下一篇
Day20 - Spring 中的事務(上)
系列文
這些年SpringBoot實戰開發教會我的事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言