Mybatis JPA

前段时间了解到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

近期将整理代码的设计思路,欢迎交流/指正.

时间: 2024-10-24 15:55:12

Mybatis JPA的相关文章

springboot与jdbc,mybatis,jpa

====================第一部分,springboot-jdbc===================== 1.创建项目 ============================================================ 原文地址:https://www.cnblogs.com/psy-code/p/9534189.html

spring boot 集成 Mybatis,JPA

相对应MyBatis, JPA可能大家会比较陌生,它并不是一个框架,而是一组规范,其使用跟Hibernate 差不多,原理层面的东西就不多讲了,主要的是应用. Mybatis就不多说了,SSM这三个框架现在基本上都是基本框架了. MyBatis 与 Spring boot 整合时除了添加必要的jar, 插件.在applicatoin.properties/application.yml 中添加相应的配置. 注意的一点就是在启动类中记得添加@MapperScan("com.spSystem.map

[MyBatis] MyBatis入门

1.MyBatis简介 MyBatis是这个框架现在的名字,而此框架最早的名字是IBatis,其名字的含义是"internet"."abatis"两个单词的组合,是在2002年的时候开始的一个开源项目,在2010年6月16日Apache将项目交与Google进行管理,更名MyBatis.所以2010年之后,MyBatis框架逐渐成为主流,比Hibernate发展更快. IBatis和MyBatis两者的操作原理是相同的.IBatis变为了MyBatis之后,核心操作

框架总结

一.Struts2的总结 1.Struts 2的工作流程,从请求说起 (1)客户端浏览器发出HTTP请求. (2)根据web.xml配置,该请求被FilterDispatcher接收. (3)根据struts.xml配置,找到需要调用的Action类和方法,经过一系列的拦截器(Interceptor)执行后,程序执行到action中的指定的方法, 并且从前台接收的参数通过IoC方式,将值注入给Aciton. (4)Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证. (5)Action

Hibernate框架基本使用

时间:2017-1-16 00:36 --什么是Hibernate Hibernate是一个开放源代码的关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以使用对象编程思维来操作数据库. Hibernate可以应用在任何使用JDBC的场景,既可以在Java的客户端程序使用,也可以在Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE框架中取代CMP,完成数据持久化的重任. Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数

Spring第三天——JdbcTemplate和spring事务管理

大致内容: aspectJ的aop操作(基于注解,对比day02配置操作)(会用) *jdbcTemplate操作(实现CRUD) *spring配置连接池 *spring事务管理 一.AspectJ的基于注解的AOP操作 (day02的配置回顾,略显麻烦,配置稍多) 建立项目记得导入day02操作aop的那些包(如果是复制项目一定要修改项目的context name) 再把配置文件拿过来 <?xml version="1.0" encoding="UTF-8"

循序渐进地培养面向对象的思维方式

在我踏入软件行业后,一直苦于没有前辈指点.我常年困惑于两个问题:一是怎样培养面向对象设计的思维能力?二是怎样进行架构设计,有无方法? 因为我做了那么多年项目,却很少看到有漂亮的面向对象思维写出来的代码,觉得有必要提醒下年轻从业者.如今总结一下自己的经历,希望对刚刚入行的朋友有些启发吧. 我的基本观念是,面向对象的思维方式是可以循序渐进地培养出来的.通俗地讲,就是不断地编码实践,量变会引起质变. 1 开发人员的思考动力不足 记得参加工作后做的第一个项目是某电信局的运营支撑系统开发,采用的开发框架是

为什么要放弃ssh框架

本文是转载他人的,觉得很好,分享! 最近听一些朋友说,招聘面试的很多人简历都差不多,大部分人的简历上面都写了熟悉ssh框架,我朋友就在吐槽,为什么这些人简历都差不多,并且都熟悉ssh框架? 后面他说, 可能这些人都是培训机构出来的, 然后培训机构对于完全外行的人都是简单培训了基本的java语法,然后介绍ssh的概念和简单的使用,然后吹嘘ssh多么牛逼,然后再通过一个简单的实战项目,然后帮你做好简历,就算完成了培训. 听到他这一番话,多少心中有些触动.我不是排斥ssh有什么不好,ssh在很多年前是

Spring 事务管理的为我们的提供了解决方案。

当我们采用:ORM 技术框架+ 偏 JDBC 的底层技术如何应对事务管理的问题呢? 我们知道 Spring 为每种数据访问技术提供了相应的事务管理器,难道需要分别为它们配置对应的事务管理器吗?它们到底是如何协作,如何工作的呢? 解决方案 当我们采用了一个高端 ORM 技术(Hibernate,JPA,JDO),同时采用一个 JDBC 技术(Spring JDBC,MyBatis),由于前者的会话(Session)是对后者连接(Connection)的封装,Spring 会"足够智能地"