【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
留言分享你的想法!
avatar-img
Err500
12會員
78內容數
遇到的坑、解過的題、新知識的探索、舊時代的遺毒!? 工作後我發現,文件更新往往跟不上新需求的更迭,犯錯的歷史總是不斷重演。因此,我改變了方式,蒐集從程式上、系統上的每一次異常處理過程,好讓再次遇到相同的問題時能快速應變。此專題就是我的錯題本,期待日後不管在工作上或交流上遇到難題,都能輕鬆地應答:有什麼難的,我都踩過。
Err500的其他內容
2025/03/16
這篇文章說明如何使用Spring JDBC Template從資料庫取得資料,並將其輸出為CSV檔案。文中詳細介紹了系統架構、程式實作,以及測試結果,並討論了未來可能的擴展。
Thumbnail
2025/03/16
這篇文章說明如何使用Spring JDBC Template從資料庫取得資料,並將其輸出為CSV檔案。文中詳細介紹了系統架構、程式實作,以及測試結果,並討論了未來可能的擴展。
Thumbnail
2025/03/15
本文比較IntelliJ IDEA、VSCode和Eclipse三種Java開發工具的優缺點,針對不同使用者族群提供建議。IntelliJ IDEA適合初學者,VSCode輕量且具彈性,Eclipse則適合舊專案開發。
Thumbnail
2025/03/15
本文比較IntelliJ IDEA、VSCode和Eclipse三種Java開發工具的優缺點,針對不同使用者族群提供建議。IntelliJ IDEA適合初學者,VSCode輕量且具彈性,Eclipse則適合舊專案開發。
Thumbnail
2025/02/21
本文介紹瞭如何在Windows系統中,透過設定.bashrc文件輕量級地配置JDK環境變數,解決不同專案使用不同JDK版本的問題,並涵蓋了環境變數的概念、用途及其他注意事項。
Thumbnail
2025/02/21
本文介紹瞭如何在Windows系統中,透過設定.bashrc文件輕量級地配置JDK環境變數,解決不同專案使用不同JDK版本的問題,並涵蓋了環境變數的概念、用途及其他注意事項。
Thumbnail
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
專案產生大量又瑣碎的作業做處理,眼下要從iReport的設定檔(jrxml)擷取每一項套印參數出來,提供給別人做Excel公式的資料表進行作業。
Thumbnail
專案產生大量又瑣碎的作業做處理,眼下要從iReport的設定檔(jrxml)擷取每一項套印參數出來,提供給別人做Excel公式的資料表進行作業。
Thumbnail
長遠的角度來看,內部函式庫還是值得投資的公司資產,只是它需要時間、人力與管理才能做得好。若有不錯的內部函式庫也可以回饋給open-source社群,畢竟,現在開發軟體已經不太可能沒有用到任何open-source的東西。雖然說是將公司資產以 open-source 釋出,但換取的利益卻不見得是零。
Thumbnail
長遠的角度來看,內部函式庫還是值得投資的公司資產,只是它需要時間、人力與管理才能做得好。若有不錯的內部函式庫也可以回饋給open-source社群,畢竟,現在開發軟體已經不太可能沒有用到任何open-source的東西。雖然說是將公司資產以 open-source 釋出,但換取的利益卻不見得是零。
Thumbnail
SQL 基本篇 - CRUD、運算子、內建函式
Thumbnail
SQL 基本篇 - CRUD、運算子、內建函式
Thumbnail
MySQL 應用到 URL Shortener 上
Thumbnail
MySQL 應用到 URL Shortener 上
Thumbnail
通常練習開發時,總不知道選擇哪些方便的GUI工具協助簡化工作,新手時期通常都會搭配MAMP or XAMPP本身的 phpmyadmin 使用,雖然沒有不可以,但在職場上通常都是跟著同事們用一樣的版本工具,這邊介紹市面上常見且好用的 MySQL GUI 工具,幫助開發人員減少工作量
Thumbnail
通常練習開發時,總不知道選擇哪些方便的GUI工具協助簡化工作,新手時期通常都會搭配MAMP or XAMPP本身的 phpmyadmin 使用,雖然沒有不可以,但在職場上通常都是跟著同事們用一樣的版本工具,這邊介紹市面上常見且好用的 MySQL GUI 工具,幫助開發人員減少工作量
Thumbnail
在Visual Studio裡有內建的SQL幫助我們存資料,SQL指的是資料庫,那麼我們就用註冊會員這個例子來看一下怎麼使用內建的SQL吧~ 最後面有寫非常基本的SQL相關語法可以做參考 Step 1:建立資料庫
Thumbnail
在Visual Studio裡有內建的SQL幫助我們存資料,SQL指的是資料庫,那麼我們就用註冊會員這個例子來看一下怎麼使用內建的SQL吧~ 最後面有寫非常基本的SQL相關語法可以做參考 Step 1:建立資料庫
Thumbnail
最近接獲一個任務,該任務的目標是替一個即將進入正式部署階段的系統,導入一個 database migration tool,以下是此任務整個思考決策的邏輯以及正式進行時技術上比較值得和大家分享的小細節。 系統背景 資料庫的設計方式,目前常見會有兩種方向,code first 以及 database
Thumbnail
最近接獲一個任務,該任務的目標是替一個即將進入正式部署階段的系統,導入一個 database migration tool,以下是此任務整個思考決策的邏輯以及正式進行時技術上比較值得和大家分享的小細節。 系統背景 資料庫的設計方式,目前常見會有兩種方向,code first 以及 database
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News