SpringBoot开发使用Mybatis还是Spring Da

2021-03-15  本文已影响0人  Java架构大仙

我觉得为啥这么多人都说Mybatis好,原因最主要是Mybatis容易上手,现在学编程学数据库基本都学过SQL,Mybatis面向DB基于SQL的模式相对来说就显得特别直观友好。

而JPA是基于ORM的,把代码和DB分离,相当于在代码和DB之间增加了一个新的层面,一套新的标准,去间接操作DB,相对SQL的模式来说就显得不够直接和易于控制,增加了学习成本,碰到这样那样问题的时候,很容易让人放弃。

特别是在团队开发的时候,你很难掌控每个人对JPA的深层机制的理解程度,为了避免木桶效应,还不如干脆都用Mybatis。其实这两者就功能的角度来说,肯定是相互学习借鉴的,Spring Data JPA也可以执行原生SQL,存储过程,Mybatis也有一部分ORM特性,选择Spring Data JPA还是选择Mybatis都不会影响到最终业务逻辑的实现。不影响业务实现的前提下,选型主要就是选择开发和维护时的效率了。

这方面的话我觉得在开发阶段频繁修改表结构时Mybatis不如Spring Data JPA或者说Hibernate的正向工程方便快捷,再考虑和spring全家桶的版本兼容性,我们团队最终选了Spring Data JPA。

我们团队早期一些项目使用的是 MyBatis,后续所有项目都换用 Spring Data JPA 了。因为在早期使用 Spring Data JPA 时,就解决掉了它最大的痛点,也就是大家经常说的不能应对复杂业务场景、不便于写复杂动态 SQL 的问题。

我写了一个 Spring Data JPA 扩展库 Fenix,能完全兼容 Spring Data JPA,可以认为是 JPA 界的 JPA Plus。该扩展库早期的目的就是为了解决复杂动态 SQL 而生的,后来也陆续扩展了更多的功能,比如提供了更高效的批量增删改的一些方法,返回自定义 JavaBean,非 null 属性的增量更新等等。

所以,你也可以像 MyBatis 那样将复杂的 JPQL (或者原生 SQL) 语句写在 XML 里面,XML 方式的本质上是让 SQL 和 Java 代码解耦,易于单独维护和管理 SQL。为了增加 SQL 语句的动态性,也可以写 #{} 表达式、if/else、foreach 等过程式的逻辑控制语法。针对常见的动态 SQL 片段,还内置引入了大量常见的 XML SQL 语义化标签,相比 MyBatis 中纯 if/else、foreach 的一些动态标签代码可读性更高、也能达到更极致的可复用性。除了支持 XML 形式的动态 JPQL (或 SQL) 写法之外,还有三种其他方式来写查询语句,分别是:基于 JPQL(或SQL) 的 Java 链式 API 方式、基于 Specification 的 Java API 方式和 JavaBean (VO) 注解的方式。后面这两种由于是基于 Specification 方式的,甚至都不用在 Repository 接口中写任何方法。

选择 Spring Data JPA 的核心原因有以下几点:

上一篇 下一篇

猜你喜欢

热点阅读