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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...