1. 程式人生 > >Mybatis JPA

Mybatis JPA

中文 data 加載 讀取 而不是 more enum枚舉類 容器 如果

前段時間了解到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.)[email protected],類中字段類型不允許使用基本數據類型(如:使用Integer定義整形而不是int);

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

3.)按照Mybatis約定,Enum枚舉類型默認以enum.name()解析,若要解析為enum.ordinal(),[email protected](value = EnumType.ORDINAL)標識.

4.)[email protected],將會在Mybatis中註冊一個domainClass.getSimpleName() + "Map"命名的ResultMap類型,[email protected]l中.細說一下原因,Mybatis-jpa是與mybatis的xml加載,註解構建是分離的,舉個不太恰當的例子,父容器不能讀取子容器中的內容.

5.)基於4,[email protected]s-jpa解析並註冊到mybatis的configuration中,其中select方法的resultMap=4中被註冊的ResultMapid.關於方法的命名與解析規則,[email protected]

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

  • 1.4代碼地址(git): https://github.com/LittleNewbie/mybatis-jpa

  • 二.構建方式
  • 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
/* [email protected]}非必須,若無此註解,或其name="",將類名解析為下劃線風格 做為表名 */
@Table(name = "user")
public class User {

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

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

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

    /* [email protected]}非必須,若無此註解,按照Mybatis約定,[email protected]}解析 */
    @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

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

Mybatis JPA