【Java】透過MyBatis框架進行資料庫操作

更新於 發佈於 閱讀時間約 8 分鐘

前言

公司近期新的小專案要移植到JBoss,意味者強迫升級JDK啦!

身為專案成員之一,順手pull專案下來,開分支自己研究一下已經訂好的架構,嘗試加上新的endpoint玩玩看。很好奇如果沒有那些複雜的抽象,最小可運作的程式會是長什麼樣子,再回來體會一下什麼叫過度設計(誤)。

本篇不會附上過多實際的程式碼,取而代之是試誤過程中遇到的問題,實際檢視log並且排除問題後,再回來跟copilot的覆盤記錄。


什麼是MyBatis

下列是詢問結果:



MyBatis 是一個持久化框架,用於簡化 Java 應用程序與資料庫之間的交互。它的主要功能包括:

  • ORM(對象關係映射)框架:MyBatis 提供了簡單而靈活的 ORM 功能,通過 XML 或註解將 SQL 查詢與 Java 方法關聯。
  • SQL 自動映射:MyBatis 可以將 SQL 查詢結果自動映射為 Java 對象,減少手動編碼的繁瑣過程。
  • 動態 SQL:支持動態生成 SQL 語句,基於參數條件構建複雜的查詢語句。
  • 緩存機制:提供一級緩存和二級緩存,提高查詢性能。
  • 簡潔靈活:相對於其他 ORM 框架(如 Hibernate),MyBatis 更加輕量級和靈活,適合複雜 SQL 查詢的需求。




恩,不懂的人光是第一句話就陣亡了,對吧?
不妨試者想想,在沒有這些持久化框架persistence framework的情況下,要怎麼透過java程式跟資料庫溝通,進行資料操作?

  • 自己建立JDBC connection
  • 寫SQL透過cursor拿到資料
  • 進行物件轉換
  • 交易管理

諸如此類純手動需要花費很大心力的作業,可以都透過框架幫助處理。


專案架構

src/
|-- main/
|   |-- java/
|       |-- com/
|           |-- example/
|               |-- demo/
|                   |-- DemoApplication.java
|                   |-- controller/
|                       |-- StudentController.java
|                   |-- mapper/
|                       |-- StudentMapper.java
|                   |-- model/
|                       |-- Student.java
|                   |-- service/
|                       |-- StudentService.java
|-- main/resources/
|   |-- application.properties
|   |-- mapper/
|       |-- StudentMapper.xml


copilot提供給我一個最簡單的RESTful API,只要get request拿取學生資料表全部資訊回傳json格式,架構示例如上。


運作過程簡述會是:

  1. 瀏覽器或是測試工具發送請求到指定url endpoint
  2. url endpoint對應到controller內特定的方法進行處理
  3. 該方法決定呼叫哪些service進行處理
  4. service透過Mapper對資料庫操作,拿回指定資料,轉換成model再回傳


Mybatis負責的部分是提供了Mapper Interface,其中簡單的小專案可以採用把SQL寫在Annotation中,複雜語法或大型專案,則可以選擇另外定義XML檔案。

下面問著問著就變成USER了,不過不影響觀念上的本質。

Annotation

@Mapper
public interface UserMapper {

@Select("SELECT id, name, email FROM users WHERE id = #{id}")
User selectUser(int id);
}

也可以把SQL另外定義成常數,再放入annotation

XML

@Mapper
public interface UserMapper {
User selectUser(@Param("id") int id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.UserMapper">
<select id="selectUser" resultType="com.example.User">
SELECT id, name, email
FROM users
WHERE id = #{id}
</select>
</mapper>

官方文件似乎是建議使用XML,可以做較多變化跟處理,我自己則有幾個開發上不太喜歡的地方:

  1. XML編輯上沒有語法提示,或者要另外安裝擴充套件
  2. 配置上有需多小地方要注意
  3. 動態SQL會讓版面變的破碎,除錯時要多做處理


後記

解決MyBatis:There is no setter for property named

問題是發生在執行SQL後,拿到資料要轉換成對應的model發生的狀況。網路上只找到幾個可能的狀況:

  1. resultMap中,轉換的property有空格
  2. 配置路徑是否有打錯
  3. 真的沒實作setter


一開始我是採用record進行實作,使用Annotation正常運作,但透過XML才發生問題,問了得到下列答覆:



這個問題確實很有趣!在使用 @Select 註解時,與 XML 配置相比,有一些差異可能影響 record 類的行為。

  • MyBatis Mapper 註解:當你使用 @Select 註解時,MyBatis 會更加依賴構造函數參數而不是 setter 方法來實例化對象。因為 record 類本身就是不可變的,MyBatis 可以自動識別構造函數並使用它來創建對象。這與 XML 配置時依賴 setter 方法的行為有所不同。
  • 語法與配置:通過註解方式,配置更加簡潔,避免了大量的 XML 配置文件。對於一些簡單的查詢和操作,使用註解的方式更直接,也更符合現代開發習慣。
  • 註解解析:在運行時,MyBatis 處理註解和處理 XML 配置的方式可能會有所不同。註解直接與 Java 代碼綁定,解析過程更緊密,而 XML 配置需要額外的映射步驟。




意思是recordimmutable的設計,所以本來就沒有提供setter,XML配置的mapper是認setter來進行轉換處理,跟Annotation不一樣,是透過constructor進行轉換。


沒辦法,為了制度及一些相容性問題,只好改回去使用Lombok@Data





avatar-img
12會員
71內容數
遇到的坑、解過的題、新知識的探索、舊時代的遺毒!? 工作後我發現,文件更新往往跟不上新需求的更迭,犯錯的歷史總是不斷重演。因此,我改變了方式,蒐集從程式上、系統上的每一次異常處理過程,好讓再次遇到相同的問題時能快速應變。此專題就是我的錯題本,期待日後不管在工作上或交流上遇到難題,都能輕鬆地應答:有什麼難的,我都踩過。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Err500 的其他內容
本文深入淺出地介紹Java的main方法,包含方法簽名、存取修飾子(public、private)、靜態關鍵字static、回傳值、傳入參數等重要概念,並以實際範例和圖解說明JVM如何尋找並執行main方法,以及static區塊的執行順序。
學習Spring Boot是Java工程師必備技能,文章分享瞭如何自學並快速上手Spring Boot開發,包括架構、開發工具、專案建立以及實作過程。
相信很多初學者學python的原因,不外乎語法簡單、好上手、重點是有很多現成的套件可以玩。那麼,Java呢?有!當然有!而且還多到你不知道該選哪個好! 今天的文章主要示範如何在vscode新建立Java 的maven專案,並且透過maven安裝這些額外的套件(依賴)
最近配合公司政策換了新電腦,重新回想起從頭建環境的惡夢。本篇文就來記錄一下如何開始踏入Java的第一步,方便起見也使用相對Eclipse、IntelliJ來說輕量不少的VScode作為編輯器。
本文深入淺出地介紹Java的main方法,包含方法簽名、存取修飾子(public、private)、靜態關鍵字static、回傳值、傳入參數等重要概念,並以實際範例和圖解說明JVM如何尋找並執行main方法,以及static區塊的執行順序。
學習Spring Boot是Java工程師必備技能,文章分享瞭如何自學並快速上手Spring Boot開發,包括架構、開發工具、專案建立以及實作過程。
相信很多初學者學python的原因,不外乎語法簡單、好上手、重點是有很多現成的套件可以玩。那麼,Java呢?有!當然有!而且還多到你不知道該選哪個好! 今天的文章主要示範如何在vscode新建立Java 的maven專案,並且透過maven安裝這些額外的套件(依賴)
最近配合公司政策換了新電腦,重新回想起從頭建環境的惡夢。本篇文就來記錄一下如何開始踏入Java的第一步,方便起見也使用相對Eclipse、IntelliJ來說輕量不少的VScode作為編輯器。
你可能也想看
Google News 追蹤
Thumbnail
本章節的目的是介紹Java中的套件使用,包括如何引用第三方套件和自定義模組,如何創建和使用自定義套件,以及介紹一些常見的Java標準庫套件。這些內容將幫助讀者更好地理解和使用Java的套件系統。
Thumbnail
此章節旨在引導讀者如何建立Java開發環境,包括安裝JDK、使用命令行工具編寫和運行Java程式,以及如何在Visual Studio Code、IntelliJ IDEA和Eclipse等IDE中設置和使用Java環境。
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
這篇文章的目的是對Java程式設計語言進行介紹,包括它的特性、應用範疇、主要使用者,以及相關的學習資源和常見的庫與框架。此外,它也提供了一些學習Java的渠道,以及與Java相關的其他知識。
Thumbnail
建立Maven專案 於pom.xml設定Spring Boot <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://
Thumbnail
本文主要在討論以 Docs as Code 方法來撰寫技術文件,此做法能否滿足企業內部對知識管理的需求。
Thumbnail
這幾年新出的語言都強打在少寫 code 和提高可讀性,更重要的是能更容易發展出 domain specific language,就這一點 Java 確實有點顯得疲態了。其實文中列的特性大多是一些語法糖衣,但對程式的可讀性和抽象度都能提昇不少,我覺得挺實用也很划算的。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
學習Spring Boot是Java工程師必備技能,文章分享瞭如何自學並快速上手Spring Boot開發,包括架構、開發工具、專案建立以及實作過程。
在前一篇文章中,我們探討了多重資料庫連線情境下,Model 及 Database Assertion 的應對方式,不過實際上筆者認為比較有難度的,其實是 Migration 應對方式。 今天就讓我們來探討這部分吧! Migration 應對方式 對於多重資料庫連線這種情境,筆者實務上做過的對應
Thumbnail
本章節的目的是介紹Java中的套件使用,包括如何引用第三方套件和自定義模組,如何創建和使用自定義套件,以及介紹一些常見的Java標準庫套件。這些內容將幫助讀者更好地理解和使用Java的套件系統。
Thumbnail
此章節旨在引導讀者如何建立Java開發環境,包括安裝JDK、使用命令行工具編寫和運行Java程式,以及如何在Visual Studio Code、IntelliJ IDEA和Eclipse等IDE中設置和使用Java環境。
Thumbnail
此章節旨在介紹Java的基本語法、註解和變數的使用。透過學習,讀者將了解Java程式的基本結構、程式進入點的定義、如何撰寫單行和多行註解,以及如何宣告和初始化變數。
Thumbnail
這篇文章的目的是對Java程式設計語言進行介紹,包括它的特性、應用範疇、主要使用者,以及相關的學習資源和常見的庫與框架。此外,它也提供了一些學習Java的渠道,以及與Java相關的其他知識。
Thumbnail
建立Maven專案 於pom.xml設定Spring Boot <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://
Thumbnail
本文主要在討論以 Docs as Code 方法來撰寫技術文件,此做法能否滿足企業內部對知識管理的需求。
Thumbnail
這幾年新出的語言都強打在少寫 code 和提高可讀性,更重要的是能更容易發展出 domain specific language,就這一點 Java 確實有點顯得疲態了。其實文中列的特性大多是一些語法糖衣,但對程式的可讀性和抽象度都能提昇不少,我覺得挺實用也很划算的。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
學習Spring Boot是Java工程師必備技能,文章分享瞭如何自學並快速上手Spring Boot開發,包括架構、開發工具、專案建立以及實作過程。
在前一篇文章中,我們探討了多重資料庫連線情境下,Model 及 Database Assertion 的應對方式,不過實際上筆者認為比較有難度的,其實是 Migration 應對方式。 今天就讓我們來探討這部分吧! Migration 應對方式 對於多重資料庫連線這種情境,筆者實務上做過的對應