Java 中数据库框架的选择

772 阅读2分钟

在 Java 项目中最常用的框架一般有:Spring 系列、安全框架、数据库框架。而其中数据库框架可以说是系统中占比最重的,其对项目的影响也是非常之大的,而一般来说框架的选择主要是在 JPA/Hibernate 和 Mybatis 系列中去选。而这 2 类的框架,优缺点都很明显。

写这篇文章也是因为国内这类框架造轮子太多了,可能没有之一。

JPA 系列

优点

  • 拥有【关联关系】建模,掌握好,无论是编码效率还是质量都是非常不错的。
  • 类型安全,可以用其自身的或者第三方的 QueryDSL,构建类型安全的动态查询。
  • 拥有事件机制等等。

缺点

  • 难以掌握,这是因为 JPA 过于追求标准,其作为 Java 官方标准的 ORM 规范。追求近乎完美的跨数据库特性,追求完备生命周期事件导致的 N+1 问题等等。其是一个【有状态】的框架,导致一些副作用。
  • 不贴近底层 SQL,出现问题不好排查。
  • 关联关系建模,没有一定的经验难以掌握,这是讲究设计的。

Mybatis 系列

优点

  • 本质就是一个 SQL Builder,上手简单易用,一般排查问题也简单。

缺点

  • 使用 xml 需要维护很多 SQL,不利于重构,类型不安全。
  • 代码量高,意味着维护代价也高。
  • 无论其衍生框架增加了多少特性,没有一个能支持【关联关系】建模和事件这种能解决业务建模的特性,顶多支持个残缺的。

我的选择(供参考)

Ebean + jOOQ

Ebean 简单理解是一个无状态的,支持部分 JPA 规范的框架,也是一个渐进式的框架,可以用 ORM 这种关联关系映射,也可以用 DSL,也可以用原生 SQL,有事件机制,支持部分数据库独有的特性,支持多数据源。我主要将其用于偏 CRUD 的场景。Ebean 的文档不全,其他都还好。

jOOQ

用于复杂动态 SQL 场景,比如复杂的分析,比直接拼接 SQL,其可以保证 SQL 的结构正确,同时具有类型安全。

没有写过于细节的东西,主要是从选型思路出发。

这是我自己的一些常用封装,供大家参考(Java 相关,不仅限于 Ebean): github.com/cn-src/jany