Mybatis實戰之TypeHandler高級進階

来源:http://www.cnblogs.com/dongying/archive/2017/02/20/6410905.html
-Advertisement-
Play Games

上篇文章分享了在項目實戰中自定義Mybatis的TypeHandler來處理枚舉類型。文章結尾也指出了美中不足之處,那就是每次都需要指定我們自定義的枚舉TypeHandler。 隨著項目枚舉類型的增多,每次都要寫一遍這個會令人很反感。那麼,本次我們就來解決這一痛點。 思路分析 1. 上篇文章講到, ...


上篇文章分享了在項目實戰中自定義Mybatis的TypeHandler來處理枚舉類型。文章結尾也指出了美中不足之處,那就是每次都需要指定我們自定義的枚舉TypeHandler。 隨著項目枚舉類型的增多,每次都要寫一遍這個會令人很反感。那麼,本次我們就來解決這一痛點。

思路分析

  1. 上篇文章講到, mybatis有預設的處理枚舉類型的TypeHandler,因此,我們要將我們自定義的枚舉TypeHandler註冊進入Mybatis。

  2. 註冊完我們自定義的TypeHandler後,還得告訴Mybatis只要一遇到我們指定的枚舉類型(上篇的DisplayedEnum)就用自定義的枚舉TypeHandler(上篇為EnumTypeHandler)進行轉換。由於Mybatis在啟動時就會通過TypeHandlerRegistry進行註冊,即建立JdbcType, JavaType, TypeHandler三者之間的關係, 因此,這意味著在Mybatis啟動時我們也需要通過TypeHandlerRegistry將我們的所有的枚舉類型(JavaType)與自定義的枚舉TypeHandler(EnumTypeHandler)建立聯繫。

為了方便大家理解, 貼上Mybatis中的TypeHandlerRegistry的相關部分源碼:

實戰

SqlSessionFactoryBean

由於我們項目使用了Spring, 是用Spring集成的Mybatis(廢話,大家都是這麼乾的)。Spring通過SqlSessionFactoryBean來初始化啟動Mybatis。 因此,我們應該在它身上下手,然而,一切並不是那麼順利。

查看了一下SqlSessionFactoryBean的源碼,發現SqlSessionFactoryBean並沒有任何地方可以讓我們切入, 進而來調用TypeHandlerRegistry進行註冊我們的枚舉。 更令人蛋疼的是其所有屬性全是private, 這下不僅AOP切入不行,連通過繼承偷懶都不行了。

作罷,咱只有老老實實的重寫一遍SqlSessionFactoryBean的代碼了(copy還不簡單)。

DefaultSqlSessionFactoryBean

代碼量比較多,就只貼關鍵代碼了。步驟如下:

  1. DefaultSqlSessionFactoryBean繼承SqlSessionFactoryBean。
  2. 將SqlSessionFactoryBean中的代碼全部copy到DefaultSqlSessionFactoryBean。
  3. 調用以下方法。

切記, 以上代碼要在這個代碼之前執行:

因為, xmlMapperBuilder.parse()方法會開始解析我們所有的所有mapper.xml的配置文件了,這時候會把resultMap也解析了,這就會導致我們自定義的TypeHandler不生效。
切記! 切記

最後

以上,代碼算是完工了,記得在Spring的配置文件中, 將SqlSessionFactoryBean替換為我們的DefaultSqlSessionFactoryBean。 不然我們的活就是白幹了。

接下來,就可以開始浪了, 之前我們需要這樣寫:

<resultMap>
    ...
    <result column="status" jdbcType="TINYINT" property="status" typeHandler="xxx.xxx.EnumTypeHandler" />
    ...
</resultMap>

而現在,我們可以不寫typeHandler了。

<resultMap>
    ...
    <result column="status" jdbcType="TINYINT" property="status" />
    ...
</resultMap>

好啦,本次就寫到這兒。

我的博客: javafan.cn



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2017年我們將聚集在打磨我們的控制項,使wijmo更易於使用,增加一些重要的新控制項 ...
  • 今天更新了一個網站,新增了一個頁面,調用WebService,在測試環境好好的,部署到正式環境後就莫名報錯: 伺服器提交了協議衝突. Section=ResponseStatusLine 網上查了好多解決方案,有說加這個配置節的: 然而並沒有什麼卵用啊! 一個偶然的發現,讓我找到了真正的原因。 我在 ...
  • 今天一個兼職結束了,又要開始尋找新的兼職公司了 ,為了貼補家用啊,為了給兒子更好的生活加油! 抒情完畢進入正題,本篇文章要解決的問題是其實在開發微信支付,微信公眾號等回調地址必須是外網可訪問的80埠地址,這就導致很多開發上的不便,網上應該有很多教程做類似的了我這篇重覆造輪子一是記錄一下以備自己將來 ...
  • 數據驗證控制項 --之心 在ASP中進行表單數據驗證時,通常開發者必須自己編寫一套驗證的規則,然後自己將這些代碼拷貝到ASP代碼中對錶單進行驗證。這樣進行驗證的方式實在不太方便,幸運的是,ASP.NET解決了這個問題,這就是數據驗證Web控制項。 數據驗證控制項是ASP.NET中專門用來驗證表單用戶輸入的 ...
  • 20170220問題解析請點擊今日問題下方的“【Java每日一題】20170221”查看(問題解析在公眾號首發,公眾號ID:weknow619) 今日問題: 請問該程式運行結果是什麼?(點擊以下“【Java每日一題】20170221”查看20170220問題解析) 題目原發佈於公眾號、簡書:【Jav ...
  • 1. 一個錯誤釋放記憶體的例子 下麵的場景會有什麼錯? 一切看上去都是有序的。new匹配了一個delete。但有一些地方確實是錯了。程式的行為是未定義的。至少來說,stringArray指向的100個string對象中的99個看上去都不能被正確釋放,因為他們的析構函數可能永遠不會被調用。 2. 使用n ...
  • 本節和下節介紹線程的基本協作機制wait/notify,本節介紹協作的場景,wait/notify的基本用法和原理,以及如何實現生產者/消費者模式 ... ...
  • 轉載請標明出處: "http://www.cnblogs.com/why168888/p/6422270.html" 本文出自: "【Edwin博客園】" Python文件基礎操作(入門1) 1. python文件操作之文件打開方式 | mode | 說明 | 註意 | | | | | | 'r' ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...