广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >怎么同时使用JPA和Mybatis
  • 467
分享到

怎么同时使用JPA和Mybatis

2024-04-02 19:04:59 467人浏览 八月长安
摘要

这篇文章主要讲解了“怎么同时使用JPA和mybatis”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么同时使用JPA和Mybatis”吧!建模@Entit

这篇文章主要讲解了“怎么同时使用JPA和mybatis”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么同时使用JPA和Mybatis”吧!

建模

@Entity @Table(name = "t_order") public class Order {      @Id   private String oid;      @Embedded   private CustomerVo customer;      @OneToMany(cascade = {CascadeType.ALL}, orphanRemoval = true, fetch = FetchType.LAZY, mappedBy = "order")   private List<OrderItem> orderItems; }

JPA 最大的特点是 sqlless,如上述的实体定义,便将数据库的表和 Java 中的类型关联起来了,JPA 可以做到根据 @Entity  注解,自动创建表结构;基于这个实体实现的 Repository 接口,又使得 JPA 用户可以很方便地实现数据的 CRUD。所以,使用 JPA  的项目,人们很少会提到”数据库设计“,人们更关心的是领域建模,而不是数据建模。

<generatorConfiguration>     <context id="my" targetRuntime="MyBatis3">              <jdbcConnection driverClass="com.Mysql.jdbc.Driver" connectionURL=""            userId="" passWord=""/>        <javaModelGenerator targetPackage="" targetProject="" />        <sqlMapGenerator targetPackage="" targetProject="" />        <javaClientGenerator targetPackage="moe.cnkirito.demo.mapper" />              <table tableName="t_order" domainObjectName="Order" />       </context> </generatorConfiguration>

Mybatis 用户更多使用的是逆向工程,例如 mybatis-generator 插件根据如上的 xml 配置,便可以直接将表结构转译成 mapper  文件和实体文件。

code first 和 table first  从结果来看是没有区别的,差异的是过程,所以设计良好的系统,并不会仅仅因为这个差异而高下立判,但从指导性来看,无疑设计系统时,更应该考虑的是实体和实体,实体和值对象的关联,领域边界的划分,而不是首先着眼于数据库表结构的设计。

建模角度来看,JPA 的领域建模思想更胜一筹。

数据更新

聊数据库自然离不开 CRUD,先来看增删改这些数据更新操作,来看看两个框架一般的习惯是什么。

JPA 推崇的数据更新只有一种范式,分成三步:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 先 findOne 映射成实体

  3. 内存内修改实体

  4. 实体整体 save

你可能会反驳我说,@Query 也存在 nativeQuery 和 JPQL 的用法,但这并不是主流用法。JPA 特别强调”整体  save“的思想,这与领域驱动设计所强调的有状态密不可分,即其认为,修改不应该是针对于某一个字段:”update table set a=b where  colomonA=xx“ ,而应该反映成实体的变化,save 则代表了实体状态最终的持久化。

先 find 后 save 显然也适用于 Mybatis,而 Mybatis 的灵活性,使得其数据更新方式更加地百花齐放。路人甲可以认为 JPA  墨守成规不懂变通,认为 Mybatis 不羁放纵爱自由;路人乙也可以认为 JPA 格式规范易维护,Mybatis 不成方圆。这点不多加评判,留后人说。

从个人习惯来说,我还是偏爱先 find 后整体 save 这种习惯的,不是说这是 JPA 的专利,Mybatis 不具备;而是 JPA  的强制性,让我有了这个习惯。

数据更新角度来看,JPA 强制使用 find+save,mybatis 也可以做到这一点,胜者:无。

数据查询

JPA 提供的查询方式主要分为两种

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 简单查询:findBy + 属性名

  3. 复杂查询:JpaSpecificationExecutor

简单查询在一些简单的业务场景下提供了非常大的便捷性,findBy + 属性名可以自动转译成 sql,试问如果可以少写代码,有谁不愿意呢?

复杂查询则是 JPA 为了解决复杂的查询场景,提供的解决方案,硬是把数据库的一些聚合函数,连接操作,转换成了 Java 的方法,虽然做到了  sqlless,但写出来的代码又臭又长,也不见得有多么的易读易维护。这算是我最不喜欢 JPA 的一个地方了,但要解决复杂查询,又别无他法。

而 Mybatis 可以执行任意的查询 sql,灵活性是 JPA 比不了的。数据库小白搜索的最多的两个问题:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 数据库分页怎么做

  3. 条件查询怎么做

Mybatis 都可以轻松的解决。

千万不要否认复杂查询:如聚合查询、Join 查询的场景。令一个 JPA 用户抓狂的最简单方式,就是给他一个复杂查询的 case。

select a,b,c,sum(a) where a=xx and d=xx group by a,b,c;

来吧,展示。可能 JPA 的确可以完成上述 sql 的转义,但要知道不是所有开发都是 JPA 专家,没人关心你用 JPA  解决了多么复杂的查询语句,更多的人关心的是,能不能下班前把这个复杂查询搞定,早点回家。

在回到复杂数据查询需求本身的来分析下。我们假设需求是合理的,毕竟项目的复杂性难以估计,可能有 1000 个数据查询需求 JPA  都可以很方便的实现,但就是有那么 10 几个复杂查询 JPA hold 不住。这个时候你只能乖乖地去写 sql 了,如果这个时候又出现一个条件查询的场景,出现了  if else 意味着连 @Query 都用不了,完全退化成了 JdbcTemplate 的时代。

那为什么不使用 Mybatis 呢?Mybatis 使用者从来没有纠结过复杂查询,它简直就是为之而生的。

如今很多 Mybatis 的插件,也可以帮助使用者快速的生成基础方法,虽然仍然需要写 sql,但是这对于开发者来说,并不是一件难事。

不要质疑高并发下,JOIN 操作和聚合函数存在的可能性,数据查询场景下,Mybatis 完胜。

性能

本质上 ORM 框架并没有性能的区分度,因为最终都是转换成 sql 交给数据库引擎去执行,ORM 层面那层性能损耗几乎可以忽略不计。

但从实际出发,Mybatis 提供给了开发者更高的 sql 自由度,所以在一些需要 sql 调优的场景下会更加灵活。

可维护性

前面我们提到 JPA 相比 Mybatis 丧失了 sql 的自由度,凡事必有 trade  off,从另一个层面上来看,其提供了高层次的抽象,尝试用统一的模型去解决数据层面的问题。sqlless  同时也屏蔽了数据库的实现,屏蔽了数据库高低版本的兼容性问题,这对可能存在的数据库迁移以及数据库升级提供了很大的便捷性。

同时使用两者

其他细节我就不做分析了,相信还有很多点可以拿过来做对比,但我相信主要的点上文都应该有所提及了。进行以上维度的对比并不是我写这篇文章的初衷,更多地是想从实际开发角度出发,为大家使用这两个框架提供一些参考建议。

在大多数场景下,我习惯使用 JPA,例如设计领域对象时,得益于 JPA  的正向模型,我会优先考虑实体和值对象的关联性以及领域上下文的边界,而不用过多关注如何去设计表结构;在增删改和简单查询场景下,JPA 提供的 api 已经是刻在我  DNA 里面的范式了,使用起来非常的舒服。

在复杂查询场景下,例如

  1. 包含不存在领域关联的 join 查询

  2. 包含多个聚合函数的复杂查询

  3. 其他 JPA 较难实现的查询

我会选择使用 Mybatis,有点将 Mybatis 当做数据库视图生成器的意味。坚定不移的 JPA  拥趸者可能会质疑这些场景的存在的真实性,会质疑是不是设计的漏洞,但按照经验来看,哪怕是短期方案,这些场景也是客观存在的,所以听我一言,尝试拥抱一下  Mybatis 吧。

随着各类存储中间件的流行,例如  mongoDB、ES,取代了数据库的一部分地位,重新思考下,本质上都是在用专业的工具解决特定场景的问题,最终目的都是为了解放生产力。数据库作为最古老,最基础的存储组件,的确承载了很多它本不应该承受的东西,那又何必让一个工具或者一个框架成为限制我们想象力的沟壑呢?

两个框架其实都不重,在 SpringBoot 的加持下,引入几行配置就可以实现两者共存了。

感谢各位的阅读,以上就是“怎么同时使用JPA和Mybatis”的内容了,经过本文的学习后,相信大家对怎么同时使用JPA和Mybatis这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么同时使用JPA和Mybatis

本文链接: https://www.lsjlt.com/news/84338.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么同时使用JPA和Mybatis
    这篇文章主要讲解了“怎么同时使用JPA和Mybatis”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么同时使用JPA和Mybatis”吧!建模@Entit...
    99+
    2022-10-19
  • Jpa Specification怎么实现and和or同时使用查询
    这篇文章主要为大家展示了“Jpa Specification怎么实现and和or同时使用查询”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Jpa Specification怎...
    99+
    2023-06-25
  • Jpa Specification如何实现and和or同时使用查询
    目录同时使用and和or的查询JPA 动态查询之AND、OR结合使用问题描述代码示例同时使用and和or的查询 UserServiceImpl 类,service实现类 impo...
    99+
    2022-11-12
  • 怎么在Java中同时使用catch和throw
    今天就跟大家聊聊有关怎么在Java中同时使用catch和throw,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 代码示例AuctionTest.javapublic c...
    99+
    2023-06-06
  • SpingBoot使用Mybatis-Plus操作多数据源,同时操作sqlserver和mysql
    目录 需求场景 需求逻辑: 难点: 说明: 代码 pom.xml依赖只贴sqlserver的 文件目录 yml配置文件  DataSource自定义注解 DataSourceAspect类文件 DruidConfig类 DruidProp...
    99+
    2023-09-05
    mybatis sqlserver mysql spring java
  • 使用MyBatis时数据库字段和实体字段不同如何解决
    这期内容当中小编将会给大家带来有关使用MyBatis时数据库字段和实体字段不同如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。当数据库字段和实体bean中属性不一致时之前数据库Person名字字段是...
    99+
    2023-05-31
    mybatis 实体字段 数据库字段
  • MyBatis中int和Integer怎么使用
    这篇文章主要介绍“MyBatis中int和Integer怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MyBatis中int和Integer怎么使用”文章能帮助大家解决问题。有关int和In...
    99+
    2023-07-05
  • jpa的save方法怎么使用
    JPA的save方法用于保存或更新实体对象。具体使用方法如下:1. 定义一个实体类,例如User。java@Entity@Table...
    99+
    2023-10-18
    jpa
  • 怎么在Springboot中使用Thymeleaf和Jpa实现登录
    本篇文章为大家展示了怎么在Springboot中使用Thymeleaf和Jpa实现登录,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先要创建一个springboot项目添加以下依赖项pom.xml...
    99+
    2023-06-15
  • mybatis使用${}时sql注入的问题怎么解决
    这篇文章给大家介绍mybatis使用${}时sql注入的问题怎么解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mybatis使用${}时sql注入的问题最近在上线项目的时候,代码审查没有通过,提示有sql注入的风险...
    99+
    2023-06-22
  • 使用php怎么禁止用户同时登陆
    本篇文章给大家分享的是有关使用php怎么禁止用户同时登陆,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。php实现禁止用户同时登录的方法:1、写入一个最新的登录IP到user表其...
    99+
    2023-06-14
  • Springboot JPA怎么使用distinct返回对象
    这篇文章主要讲解了“Springboot JPA怎么使用distinct返回对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Springboot JPA怎么使用dist...
    99+
    2023-06-29
  • 怎么利用Spring Boot和JPA创建GraphQL API
    本篇内容主要讲解“怎么利用Spring Boot和JPA创建GraphQL API”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么利用Spring Boot和JP...
    99+
    2023-06-30
  • mybatis的mapper怎么使用
    MyBatis的mapper是用于映射数据库操作的接口,通过这个接口可以方便地调用SQL语句进行数据库的增删改查操作。使用步骤如下:...
    99+
    2023-09-29
    mybatis
  • mybatis之BaseTypeHandler怎么使用
    本篇内容主要讲解“mybatis之BaseTypeHandler怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis之BaseTypeHandler怎么使用”吧!BaseType...
    99+
    2023-07-05
  • Linux中怎么使用ntpdate进行时间同步
    这篇文章主要介绍“Linux中怎么使用ntpdate进行时间同步”,在日常操作中,相信很多人在Linux中怎么使用ntpdate进行时间同步问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中怎么使用n...
    99+
    2023-06-27
  • Linux中怎么使用Chrony进行时间同步
    这篇文章主要介绍了Linux中怎么使用Chrony进行时间同步的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux中怎么使用Chrony进行时间同步文章都会有所收获,下面我们一起来看看吧。Chrony简介:...
    99+
    2023-06-28
  • Mybatis中怎么使用sum对字段求和
    这篇文章主要讲解了“Mybatis中怎么使用sum对字段求和”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis中怎么使用sum对字段求和”吧!使用sum对字段求和如下sql,为计算...
    99+
    2023-06-29
  • Mybatis中association和collection怎么用
    这篇文章将为大家详细讲解有关Mybatis中association和collection怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。association和collection用法1.单个关联查询...
    99+
    2023-06-29
  • 浅谈@RequestBody和@RequestParam可以同时使用
    目录@RequestBody和@RequestParam可以同时使用吗自己个人实际验证结果在postman发送如下post请求,返回正常body中参数如下值得注意的地方@Reques...
    99+
    2022-11-13
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作