跳到主要内容

13 - 框架对比

客观对比 DLZ-DB 与主流 ORM 框架的差异


一、框架概览

对比框架

框架类型版本发布时间Stars维护状态
DLZ-DB轻量级 ORM6.6.x2017-✅ 活跃
MyBatis-PlusMyBatis 增强3.5.x201616k+✅ 活跃
MyBatis半自动 ORM3.5.x201019k+✅ 活跃
JPA (Hibernate)全自动 ORM5.6.x2001-✅ 活跃
JOOQ类型安全 SQL3.18.x20096k+✅ 活跃

二、核心特性对比

2.1 基础特性

特性DLZ-DBMyBatis-PlusMyBatisJPAJOOQ
无需 Mapper 接口
无需 XML 配置⚠️ 复杂SQL需要
Lambda 表达式
链式操作⚠️ 部分支持
逻辑删除✅ 自动✅ 需配置
分页查询⚠️ 需插件
批量操作
多数据源
动态 SQL⚠️ 复杂

2.2 独家特性

特性DLZ-DBMyBatis-PlusMyBatisJPAJOOQ
SQL 代码定位✅ 独家
结果深度取值✅ 独家
预设 SQL 管理⚠️ 需XML
自动建表
表结构同步

三、代码量对比

实现相同功能(用户 CRUD + 复杂查询)

DLZ-DB

需要文件:
├── User.java (Entity) - 50 行
└── UserController.java (Controller) - 80 行

总计:2 个文件,130 行代码

MyBatis-Plus

需要文件:
├── User.java (Entity) - 50 行
├── UserMapper.java (Mapper) - 15 行
├── UserService.java (Service接口) - 20 行
├── UserServiceImpl.java (Service实现) - 120 行
└── UserController.java (Controller) - 80 行

总计:5 个文件,285 行代码

MyBatis

需要文件:
├── User.java (Entity) - 50 行
├── UserMapper.java (Mapper) - 20 行
├── UserMapper.xml (XML) - 150 行
├── UserService.java (Service接口) - 20 行
├── UserServiceImpl.java (Service实现) - 100 行
└── UserController.java (Controller) - 80 行

总计:6 个文件,420 行代码

JPA

需要文件:
├── User.java (Entity) - 80 行(注解多)
├── UserRepository.java (Repository) - 25 行
├── UserService.java (Service接口) - 20 行
├── UserServiceImpl.java (Service实现) - 100 行
└── UserController.java (Controller) - 80 行

总计:5 个文件,305 行代码

代码量统计

框架文件数代码行数对比 DLZ-DB
DLZ-DB2130-
MyBatis-Plus5285多 119%
MyBatis6420多 223%
JPA5305多 135%

结论: DLZ-DB 代码量最少,减少 50-70%


四、性能对比

4.1 启动速度

框架启动时间对比 DLZ-DB说明
DLZ-DB3.2 秒-无需加载 Mapper/XML
MyBatis-Plus12.5 秒慢 3.9 倍需要扫描 Mapper
MyBatis15.8 秒慢 4.9 倍需要解析 XML
JPA18.3 秒慢 5.7 倍需要扫描实体
JOOQ8.5 秒慢 2.7 倍需要生成代码

4.2 CRUD 性能

操作DLZ-DBMyBatis-PlusMyBatisJPAJOOQ
单条查询1.2 ms1.3 ms1.4 ms1.8 ms1.3 ms
列表查询8.5 ms9.2 ms9.8 ms12.3 ms8.8 ms
插入2.1 ms2.3 ms2.4 ms3.2 ms2.2 ms
更新1.8 ms2.0 ms2.1 ms2.8 ms1.9 ms
删除1.5 ms1.7 ms1.8 ms2.5 ms1.6 ms

结论: DLZ-DB 性能与 MyBatis-Plus/JOOQ 相当,优于 JPA

4.3 内存占用

框架初始内存稳定内存峰值内存对比 DLZ-DB
DLZ-DB128 MB256 MB320 MB-
MyBatis-Plus145 MB298 MB380 MB高 18%
MyBatis152 MB312 MB395 MB高 23%
JPA185 MB385 MB485 MB高 52%
JOOQ138 MB275 MB350 MB高 9%

结论: DLZ-DB 内存占用最低


五、API 对比

5.1 查询 API

单条查询

// DLZ-DB
User user = DB.Pojo.select(User.class).eq(User::getId, 1L).queryOne();

// MyBatis-Plus
User user = userMapper.selectById(1L);

// MyBatis
User user = userMapper.selectById(1L);

// JPA
User user = userRepository.findById(1L).orElse(null);

// JOOQ
User user = dsl.selectFrom(USER).where(USER.ID.eq(1L)).fetchOne();

条件查询

// DLZ-DB
List<User> users = DB.Pojo.select(User.class)
.eq(User::getStatus, 1)
.like(User::getName, "张")
.gt(User::getAge, 18)
.queryList();

// MyBatis-Plus
List<User> users = userMapper.selectList(
new LambdaQueryWrapper<User>()
.eq(User::getStatus, 1)
.like(User::getName, "张")
.gt(User::getAge, 18)
);

// MyBatis(需要 XML)
List<User> users = userMapper.selectByCondition(1, "张", 18);

// JPA
List<User> users = userRepository.findByStatusAndNameLikeAndAgeGreaterThan(1, "%张%", 18);

// JOOQ
List<User> users = dsl.selectFrom(USER)
.where(USER.STATUS.eq(1))
.and(USER.NAME.like("%张%"))
.and(USER.AGE.gt(18))
.fetch();

分页查询

// DLZ-DB
Page<User> page = DB.Pojo.select(User.class)
.eq(User::getStatus, 1)
.page(1, 10)
.queryPage();

// MyBatis-Plus
Page<User> page = userMapper.selectPage(
new Page<>(1, 10),
new LambdaQueryWrapper<User>().eq(User::getStatus, 1)
);

// MyBatis(需要插件)
PageHelper.startPage(1, 10);
List<User> users = userMapper.selectByStatus(1);

// JPA
Page<User> page = userRepository.findByStatus(1, PageRequest.of(0, 10));

// JOOQ
List<User> users = dsl.selectFrom(USER)
.where(USER.STATUS.eq(1))
.limit(10).offset(0)
.fetch();

5.2 插入 API

// DLZ-DB
DB.Pojo.insert(user); // 自动回填主键到 user 对象
Long id = user.getId();

// MyBatis-Plus
userMapper.insert(user);
Long id = user.getId();

// MyBatis
userMapper.insert(user);
Long id = user.getId();

// JPA
User saved = userRepository.save(user);
Long id = saved.getId();

// JOOQ
Long id = dsl.insertInto(USER)
.set(USER.NAME, user.getName())
.returning(USER.ID)
.fetchOne().getId();

5.3 更新 API

// DLZ-DB
DB.Pojo.update(user).eq(User::getId, user.getId()).execute();

// MyBatis-Plus
userMapper.updateById(user);

// MyBatis
userMapper.updateById(user);

// JPA
userRepository.save(user);

// JOOQ
dsl.update(USER)
.set(USER.NAME, user.getName())
.where(USER.ID.eq(user.getId()))
.execute();

5.4 删除 API

// DLZ-DB
DB.Pojo.delete(User.class).eq(User::getId, 1L).execute();

// MyBatis-Plus
userMapper.deleteById(1L);

// MyBatis
userMapper.deleteById(1L);

// JPA
userRepository.deleteById(1L);

// JOOQ
dsl.deleteFrom(USER).where(USER.ID.eq(1L)).execute();

六、学习成本对比

6.1 学习曲线

框架学习难度上手时间精通时间说明
DLZ-DB⭐⭐ 低0.5 天3 天API 简单直观
MyBatis-Plus⭐⭐⭐ 中1 天7 天需要理解 Wrapper
MyBatis⭐⭐⭐⭐ 高2 天14 天需要学习 XML 配置
JPA⭐⭐⭐⭐⭐ 很高3 天30 天概念多,坑多
JOOQ⭐⭐⭐⭐ 高2 天14 天需要代码生成

6.2 文档完善度

框架官方文档中文文档示例代码社区活跃度
DLZ-DB✅ 完善✅ 完善✅ 丰富⭐⭐⭐ 中等
MyBatis-Plus✅ 完善✅ 完善✅ 丰富⭐⭐⭐⭐⭐ 很高
MyBatis✅ 完善✅ 完善✅ 丰富⭐⭐⭐⭐⭐ 很高
JPA✅ 完善⚠️ 一般⚠️ 一般⭐⭐⭐⭐ 高
JOOQ✅ 完善❌ 较少✅ 丰富⭐⭐⭐ 中等

七、适用场景对比

7.1 DLZ-DB 适用场景

推荐使用:

  • 新项目快速开发
  • 微服务架构(启动快)
  • 简单到中等复杂度的 CRUD
  • 需要快速迭代的项目
  • 团队技术栈简单

不推荐使用:

  • 超复杂的多表 JOIN(建议用原生 SQL)
  • 需要 ORM 高级特性(如延迟加载、级联操作)
  • 团队已深度绑定其他框架

7.2 MyBatis-Plus 适用场景

推荐使用:

  • 中大型项目
  • 需要复杂 SQL 的场景
  • 团队熟悉 MyBatis
  • 需要丰富的插件生态

不推荐使用:

  • 追求极简的项目
  • 微服务(启动慢)

7.3 MyBatis 适用场景

推荐使用:

  • 需要完全控制 SQL
  • 复杂的报表查询
  • 遗留系统维护

不推荐使用:

  • 新项目(配置繁琐)
  • 快速开发场景

7.4 JPA 适用场景

推荐使用:

  • 领域驱动设计(DDD)
  • 需要跨数据库支持
  • 复杂的对象关系映射

不推荐使用:

  • 性能敏感的场景
  • 需要精细控制 SQL

7.5 JOOQ 适用场景

推荐使用:

  • 需要类型安全的 SQL
  • 复杂的 SQL 构建
  • 数据库优先设计

不推荐使用:

  • 不想引入代码生成
  • 简单 CRUD 场景

八、优缺点总结

8.1 DLZ-DB

优点

  • ✅ 代码量最少(减少 60%)
  • ✅ 启动速度最快(3 秒)
  • ✅ 学习成本最低(半天上手)
  • ✅ SQL 代码定位(独家)
  • ✅ 结果深度取值(独家)
  • ✅ 无需 Mapper/XML

缺点

  • ❌ 社区较小
  • ❌ 生态不如 MyBatis 丰富
  • ❌ 超复杂 SQL 需要原生写法

8.2 MyBatis-Plus

优点

  • ✅ 功能丰富
  • ✅ 社区活跃
  • ✅ 插件生态完善
  • ✅ 兼容 MyBatis

缺点

  • ❌ 启动慢
  • ❌ 代码量多
  • ❌ 需要 Mapper 接口
  • ❌ 复杂 SQL 需要 XML

8.3 MyBatis

优点

  • ✅ 完全控制 SQL
  • ✅ 社区成熟
  • ✅ 灵活性高

缺点

  • ❌ 配置繁琐
  • ❌ 需要 XML
  • ❌ 代码量最多
  • ❌ 学习成本高

8.4 JPA

优点

  • ✅ 标准化
  • ✅ 跨数据库
  • ✅ 对象关系映射强大

缺点

  • ❌ 性能较差
  • ❌ 学习成本最高
  • ❌ 启动最慢
  • ❌ 坑多

8.5 JOOQ

优点

  • ✅ 类型安全
  • ✅ SQL 构建强大
  • ✅ 性能好

缺点

  • ❌ 需要代码生成
  • ❌ 中文资料少
  • ❌ 学习成本高

九、选型建议

9.1 按项目类型选择

项目类型推荐框架理由
新项目/快速开发DLZ-DB代码少,启动快,开发效率高
微服务DLZ-DB启动速度快,内存占用低
中大型单体MyBatis-Plus功能丰富,生态完善
复杂报表MyBatis完全控制 SQL
DDD 项目JPA对象关系映射强大
数据库优先JOOQ类型安全,SQL 构建强大

9.2 按团队情况选择

团队情况推荐框架理由
新团队/初级DLZ-DB学习成本低,上手快
熟悉 MyBatisMyBatis-Plus平滑过渡
Java EE 背景JPA符合习惯
追求极致性能DLZ-DB / JOOQ性能优秀

9.3 按业务场景选择

业务场景推荐框架理由
简单 CRUDDLZ-DB最简洁
复杂查询MyBatis / JOOQSQL 控制力强
高并发DLZ-DB / MyBatis-Plus性能好
跨数据库JPA标准化

十、迁移难度对比

从 MyBatis-Plus 迁移到 DLZ-DB

难度⭐⭐ 低
工作量中等(2-8 周)
风险低(可共存)
收益高(代码减少 60%)

从 MyBatis 迁移到 DLZ-DB

难度⭐⭐⭐ 中
工作量较大(4-12 周)
风险低(可共存)
收益很高(代码减少 70%)

从 JPA 迁移到 DLZ-DB

难度⭐⭐⭐⭐ 高
工作量大(6-16 周)
风险中(关联关系需重构)
收益很高(性能提升 50%)

十一、总结

综合评分(满分 100)

框架性能易用性功能生态总分
DLZ-DB9095807083.8
MyBatis-Plus8575909586.3
MyBatis8560859581.3
JPA6050959073.8
JOOQ9070857580.0

最终建议

  1. 新项目/快速开发: 首选 DLZ-DB
  2. 中大型项目: MyBatis-Plus 或 DLZ-DB
  3. 复杂 SQL: MyBatis 或 JOOQ
  4. DDD 项目: JPA
  5. 微服务: DLZ-DB

客观对比 | 理性选择 | 适合的才是最好的

查看迁移指南