Mybatis JPA

来源:http://www.cnblogs.com/svili/archive/2017/05/08/6828077.html
-Advertisement-
Play Games

前段時間瞭解到Spring JPA,感覺挺好用,但其依賴於Hibernate,本人看到Hibernate就頭大(不是說Hibernate不好哈,而是進階太難),於是做了一個迷你版的Mybatis JPA. 一.簡介 1.1粗糙點 1.)Entity不支持實體類的嵌套; 2.)目前不支持批量操作,不支 ...


前段時間瞭解到Spring JPA,感覺挺好用,但其依賴於Hibernate,本人看到Hibernate就頭大(不是說Hibernate不好哈,而是進階太難),於是做了一個迷你版的Mybatis JPA.

  • 一.簡介
  • 1.1粗糙點

1.)Entity不支持實體類的嵌套;

2.)目前不支持批量操作,不支持分頁查詢(這個後續會有的);

3.)僅支持單表,單欄位作為where條件(我目前是這樣理解的,複雜的SQL還是手工構建比較好,更靈活且便於維護,一般的SQL可以使用Mybatis註解,複雜的SQL最好還是用xml構建);

  • 1.2優點

1.)mybatis-jpa是基於Mybatis 和Spring增強插件,沒有對依賴包(源代碼)造成污染.

2.)由mybatis-jpa 解析的Mapper介面中定義的方法(method),將被註冊到Mybatis Configuration中,即Mapper的代理和註入由依舊由Mybatis和Spring構建和管理,不影響原有的代碼模式和工作模式.

2.)mybatis-jpa SQL的解析和Statement的註冊 時機是在Spring applicationContext初始化完成時,只會解析一次,不影響性能.

 

  • 1.3約定

1.)Entity實體類需使用@Entity註解標記,類中欄位類型不允許使用基本數據類型(如:使用Integer定義整形而不是int);

2.)不支持Entity的嵌套,即實體中定義其他實體欄位類型,mybatis-jpa只支持單表,其無法解析Entity的嵌套無法解析.

3.)按照Mybatis約定,Enum枚舉類型預設以enum.name()解析,若要解析為enum.ordinal(),需使用註解@Enumrated(value = EnumType.ORDINAL)標識.

4.)被@MapperDefinition註解標識的Mapper介面,將會在Mybatis中註冊一個domainClass.getSimpleName() + "Map"命名的ResultMap類型,且此ResultMap不能用於Mybatis的@ResultMap註解和Mapper.xml中.細說一下原因,Mybatis-jpa是與mybatis的xml載入,註解構建是分離的,舉個不太恰當的例子,父容器不能讀取子容器中的內容.

5.)基於4,mapper中被@StatementDefinition註解標識的方法會被mybatis-jpa解析並註冊到mybatis的configuration中,其中select方法的resultMap=4中被註冊的ResultMapid.關於方法的命名與解析規則,見@StatementDefinition註解。

6.)測試代碼在test目錄,關於設計思路與代碼目錄會另開博文.

 

  • 二.構建方式
  • 2.1 配置文件
<!-- 在spring-mybatis配置文件中,增加以下配置即可.詳見configs/spring-mybatis.xml -->
<!-- Mybatis JPA Mapper 所在包路徑 -->
    <bean class="com.mybatis.jpa.core.MapperEnhancerScaner">
        <property name="basePackage" value="com.ybg.mapper" />
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
  • 2.2 Entity

示例代碼

@Entity
/* {@Table}非必須,若無此註解,或其name="",將類名解析為下劃線風格 做為表名 */
@Table(name = "user")
public class User {

    /* 非持久化欄位 */
    @Transient
    private static final long serialVersionUID = -7788405797990662048L;

    /* {@Id}必須,主鍵標識,{@Column}非必須,若無此註解,或其name="",將欄位名解析為下劃線風格 做為SQL列名 */
    @Id
    @Column(name = "user_Id")
    private Integer userId;

    @Column(name = "password_alias")
    private String password;

    /* {@Enumerated}非必須,若無此註解,按照Mybatis約定,枚舉類型使用{@EnumTypeHandler}解析 */
    @Enumerated
    @Column(name = "state")
    private DataStateEnum state;

    @Column(name = "create_Time")
    private java.util.Date createTime;

2.3 mapper

示例代碼

@Repository
@MapperDefinition(domainClass = User.class)
/*entends MybatisBaseMapper非必須,它只是定義了公共的方法簽名,便於風格的統一*/
public interface UserMapper extends MybatisBaseMapper<User> { /* Like 的通配符需要自行添加 */ @StatementDefinition List<User> selectByUserNameLike(String userName); @StatementDefinition List<User> selectByUserIdLessThan(Integer userId); @StatementDefinition List<User> selectByUserIdIsNull(); /*more condition or complex SQL,need yourself build*/ @Select("select * from ybg_test_user where user_name = #{userName} and dept_id = #{deptId}") @ResultMap(value="BaseResultMap") List<User> selectComplex(Map<String, Object> args); /*build with mapper.xml*/ List<User> selectComplex2(Map<String, Object> args);

集成mybatis-jpa,僅需以上3步.

如果你想深入瞭解,項目代碼目錄還算清晰,源碼中有大量必要的註釋,你會發現有部分英文註釋,不要慌,是我寫的,現在感覺有些代碼用英文描述反而會簡單一些,用中文反而不能夠被很好的理解.

源碼調試/閱讀入口 com.mybatis.jpa.core.MapperEnhancerScaner -->PersistentMapperEnhancer 

近期將整理代碼的設計思路,歡迎交流/指正.

 


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

-Advertisement-
Play Games
更多相關文章
  • 02 線性結構2:一元多項式的乘法與加法運算 Description: 設計函數分別求兩個一元多項式的乘積與和。 Input: 輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入一個多項式非零項繫數和指數(絕對值均為不超過1000的整數)。數字間以空格分隔。 Output: 輸出分2 ...
  • 轉載請標明原文地址:http://www.cnblogs.com/zhangyukof/p/6785258.html 一、準備工作 已搭建好的SSH框架工程一個,如果沒有,請參考我的上一篇文章《SSH框架搭建詳細圖文教程》。 二、登陸功能 1.打開MyEclipse切換到MyEclipse Data ...
  • 摘要:直接選擇排序屬於選擇排序的一種,但是它的排序演算法比冒泡排序的速度要快一些,由於它的演算法比較簡單,所以也比較適合初學者學習掌握。 適宜人群:有一定Java SE基礎,明白Java的數據類型,數組的定義、初始化以及常用數組的方法,還有Java的迴圈操作。 前期準備:最好有一個開發工具比如說:ecl ...
  • 1 package IO; 2 3 import java.io.FileWriter; 4 import java.io.IOException; 5 6 class FileWrite_WenJianXuXie { 7 /*拋是為了方便演示 續寫功能,平時別拋*/ 8 public static... ...
  • [原創]用WinRAR實現VC源代碼快速壓縮創建 by edata @ cnblogs.com/edata 2017-5-8 22:31:57 我們有的時候需要對vc項目壓縮打包,因為vc項目的無關文件太多,直接壓縮的文件非常大,我們有必要過濾一些無關的文件,只需要我們要的源碼,這裡我給大家分享一種 ...
  • IntelliJ IDEA-2017.1.1 tomcat-8.5.13 問題:在IntelliJ IDEA中使用tomcat部署web app時,提示:Error during artifact deployment. See server log for details IntelliJ IDE ...
  • 多進程網路編程中處理fork後可能的僵死進程和可能被中斷的系統調用問題。 ...
  • Python實現 PHP實現 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...