【Java】透過MyBatis框架進行資料庫操作
avatar-img
Err500

【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
Err500
12會員
76內容數
遇到的坑、解過的題、新知識的探索、舊時代的遺毒!? 工作後我發現,文件更新往往跟不上新需求的更迭,犯錯的歷史總是不斷重演。因此,我改變了方式,蒐集從程式上、系統上的每一次異常處理過程,好讓再次遇到相同的問題時能快速應變。此專題就是我的錯題本,期待日後不管在工作上或交流上遇到難題,都能輕鬆地應答:有什麼難的,我都踩過。
留言
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作為編輯器。