Mybatis自动生成的各种文件如example,mapper.xml等过于繁杂,很多用不到,且部分使用(如涉及example)比较麻烦,并且简单的单表查询语句也需要写SQL语句去实现(此处单表查询考虑使用JPA,后面详细说明)。
①JPA继承JpaRepository后,无需任何数据访问层,也无需手写任何sql,即可实现完整的数据操作方法,并且在JpaRepository中还有大量已经定义好的方法可以直接使用。如果有部分需求并不存在预定义方法,也可以在Repo中简单书写方法,在IDEA中还可以得到代码补全提示,可以轻松指定查询的字段(单一字段)
②单表查询使用mybatis或者mybatis plus时,都需要手写SQL,比如查询表中某一字段时,或者查询某一字段是否存在某值时。
③使用JPA可以使实体类与数据库字段进行映射,可以自动生成对应的数据库表,index、unique也可以通过注解方式指定。
④相比于Mybatis易于维护,不需要修改配置文件,即解耦。
⑤多表映射时较复杂,但项目中对于此功能没有需求,因为表与表之间没有设置外键,只有逻辑上的依赖关系,所以在此处使用JPA不用考虑多表关联的关系。
⑥JPA不会对已经存在的数据库中的表的字段进行修改,只会新增字段,如需修改字段需要人工干预,所以不会对现有项目的数据库产生变动。
⑦对于update来说,使用find + save方法即可,不需要书写SQL语句,因为如果修改的字段时不确定的,使用find + save并不需要考虑哪些字段被改变了,配合注解@DynamicUpdate,还可以简化JPA在保存时生成的SQL,达到优化的效果,即哪个字段改变了,就去对哪个字段进行修改,不会对没有变动的字段进行修改,更符合update的需求。在Mybatis Plus中有许多中方式可以实现update,但是这样从某种意义上来说,使得update变得并不规范,而JPA强制find + save的规范,更有助于代码的统一,使得代码管理以及使用更有确定性,不会有未知的错误。
⑧审计功能的支持,如:有需要自动变更更新时间的字段,只需要搭配注解@UpdateTimestamp即可支持。如果有需要插入数据时自动保存当前时间的字段,只需要搭配注解@CreationTimestamp即可支持。Mybatis对于此类审计功能需要自定义注解+拦截器实现,Mybatis Plus则需要实现MetaObjectHandler并注入容器,相对于JPA较为麻烦。
①众所周知,Mybatis Plus可以平滑地从Mybatis升级,这在Mybatis Plus的设计理念中就已经提到,Mybatis Plus就是在Mybatis的基础上进行了扩充,实现了一些Mybatis的功能增强以及包装等,使在使用的时候可以很顺利地升级。
②Mybatis Plus在使用的时候可以不书写xml文件(当然,想继续要使用xml文件也是可以的),且在Mybatis时期的一些配置类可以直接移除,不需要进行修改,因为在Mybatis Plus中就已经内嵌了。
③Mybatis Plus不需要使用分页插件,其自带分页功能。分页功能不需要额外引入pom依赖,只需要实现分页拦截器,即将分页拦截器注册进Mybatis Plus即可。所以Mybatis Plus在这个方面还相当于Mybatis+PageHelper。
④因为JPA对于多表联查的功能使用较为复杂,代码难度陡升,阅读性也较差,Mybatis Puls在这方面具有一定优势,所以在多表联查时考虑使用Mybatis Plus,对于后续可能新增的相关于多表的需求可以有很好的支持,以及可以将现有的Mybatis的实现直接移植,无需进行SQL修改等。
⑤相同的多表联查SQL,JPA查询的结果不可以直接使用DTO/VO进行接收,需要使用Map获取,Mybatis Puls则可以使用DTO/VO进行接收自定义多表查询结果。
①使用JPA更多的是一种面向对象的思想,在操作数据时,可以直接通过实体类进行操作,在处理单表时,极大地简化了代码量以及逻辑思考,使在数据操作时可以更多地关注于对象,Mybatis Plus则是更多的面向关系、映射的。
②使用JPA自动建表可以更多地考虑表结构是否合理,并且可以简单地进行变更,如:新增索引。JPA的实体类,Mybatis Plus也可以使用,并且可以直接当做映射进行使用,只需要简单增加注解@TableName在类上和@TableId在Id字段上即可。
③JPA可以直接增添,与Mybatis Plus可以兼容,两者互不干扰;Mybatis Plus可以在Mybatis的基础上直接升级,对原有功能可以直接移植,只需要移除Mybatis的pom依赖,yml配置,以及Java代码中的配置类。因为Mybatis很多内容都是通过自动生成功能生成出来的,有很多的冗余部分,这些冗余部分也可以直接移除,对于Mybatis Plus来说,移除不会有任何影响。
④JPA用于单表查询时更为简单,Mybatis Plus用于多表查询、动态查询(JPA的动态查询需要继承JpaSpecificationExecutor,查询条件需要撰写Specification)时更为方便,两者联合使用,对于功能实现更佳,且不会有兼容性问题。基于Mybatis Plus,还有一个扩展的叫做mybatis-plus-join,对连表查询这个方面进行了扩展,它对Mybatis Plus的BaseMapper和IService进行了包装,所以直接继承MPJ的相关内容,不会影响Mybatis Plus的使用。
使用JPA + Mybatis Plus(搭配mybatis-plus-join),实现对数据访问及操作,替代了原先的Mybatis后,简化了对数据访问、操作的内容,提高了阅读代码效率、代码书写效率,且更符合面向对象的思想,同时兼容了对于关系映射的处理。JPA单表处理(repo层有预定义查询方法)+表结构对应数据库,Mybatis Plus联表查询+复杂查询(mapper层撰写对应查询),使得对数据的操作可以分层划分清晰,使用更加规范、方便。