MyBatis学习06-各ORM框架对比
- 1 JDBC
- 1.1 使用场景
- 1.2 优点
- 1.3 缺点
- 2 DbUtils
- 2.1 使用场景
- 2.2 优点
- 2.3 缺点
- 3 JdbcTemplate
- 3.1 使用场景
- 3.2 优点
- 3.3 缺点
- 4 Hibernate
- 4.1 使用场景
- 4.2 优点
- 4.3 缺点
- 5 Spring-Data-JPA
- 5.1 使用场景
- 5.2 优点
- 5.3 缺点
- 6 Mybatis
- 6.1 使用场景
- 6.2 优点
- 6.3 缺点
1 JDBC
非 ORM 框架,JAVA 最低层的数据库操作方式。
1.1 使用场景
现在已经很少使用 JDBC 进行数据库的操作了。使用的场景有:
- 一些对数据库相关性能有极致要求的小系统。
- 培训或者教学使用。
1.2 优点
- 所有 ORM 框架底层最终都会使用到 JDBC 方式,JDBC 方式是所有 ORM 框架的基石。掌握 JDBC 有助于学习后续所有的 ORM 框架。
- 性能是最快的。
- 兼容所有的数据库(只要有对应的数据库驱动包)。
1.3 缺点
- 封闭程度不够,需要开发写的代码比较多。
- 数据库连接、预加载、结果集等资源需要开发单独进行管理。
- SQL 存在硬编码。
- 结果集进行对象映射还需要单独进行抽取才能适应不同的对象。
2 DbUtils
非 ORM 框架,对 JDBC 进行了简单的封装。
2.1 使用场景
由于各 ORM 框架的兴起,DbUtils 现在基本很少使用,使用场景有:
- 一些不想集成 Spring框架、不想集成 ORM 框架只想简单进行实现的小系统。
- 先前一些小公司自己使用 DbUtils 封装好的框架,基于成本考虑不想升级框架,由这类框架开发的系统。
2.2 优点
- 对 JDBC 进行了基础的封闭,开发过程更方便。
- 加强了对资源的管理,如只要传入数据源,后续使用过程中都是主动进行数据源的关闭。
- 加载了对结果集的操作,只要传入对应的 model 类,就可以自动将结果集映射成对象数据。
- 解决了可能由于研发人员疏忽导致连接池或其它对象未关闭的问题。
2.3 缺点
- 封闭程度不够,还是需要开发进行功能的补充,如获取数据源。
- SQL 存在硬编码。
- 连接池等管理上存在问题,如调用查询等接口后,DbUtils会主动关闭数据库连接,该操作对性能会有影响。
- 该技术比较旧,官网上2017年7月后就没有再更新了。
3 JdbcTemplate
非 ORM 框架,对 JDBC 进行了简单的封装。
3.1 使用场景
JdbcTemplate 是 Spring 对 JDBC 的一层封装,使用 JdbcTemplate 必须要集成 Spring,但 Spring 同时提供了 Spring Data JPA,使用 JdbcTemplate 不如使用 Spring Data JPA,不集成 Spring 则可以使用 Mybatis、Hibernate 等其它的 ORM 框架,由于笔者接触的项目不多,想不到 JdbcTemplate 的使用场景。个人猜测,使用场景如下:
- 集成了 Spring ,项目规模不大,只需要基础的 JdbcTemplate 功能实现即可实现功能。
- 对项目的性能、设计规划无太多的要求,只需要简单的实现的系统。
3.2 优点
- 是 Spring 对 JDBC 的一层封装,可灵活的进行 Sql 语句的编写。
- 性能基本上与纯 JDBC 方式一致。
- 基于 Spring,目前大部分系统都会集成 Spring 进行开发,所以可以天然的使用 JdbcTemplate。
- 与 Spring 配合使用,数据源、数据库连接池等其它资源都交由 Spring 进行管理
3.3 缺点
- 只是 Spring 进行了封装,封装程度不够高,开发过程中还是需要写大量的代码。
- SQL 存在硬编码。
- 要使用时必须基于 Spring 框架进行使用。
- 在代码中存在硬编码。
4 Hibernate
重量级的 ORM 框架。
4.1 使用场景
- 由于框架是重量级的,所以 Hibernate 适配在大规模的系统中使用。
- 对 SQL 优化要求不高的系统。
- 系统间表关系较简单。
- 对研发效率有一定要求。
4.2 优点
- 对象化。人员以面相对象的思想来操作数据库。Hibernate 支持许多面向对象的特性,如组合,继承,多态等。
- 更好的移植性.对于不同的数据库,开发者只需要使用相同的数据操作即可.
- 开发效率高。Hibernate 提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需写大量的sql语句,这就极大的提高了开发者的开发效率。
- 缓存机制的使用。Hibernate (session 缓存,二级缓存,查询缓存),对于那些改动不大且经常使用的数据,可以将它们放到缓存中,不必在每次使用时都去查询数据库,缓存机制对提升性能大有裨益。
4.3 缺点
- 由于对持久层封装过于完整,导致开发人员无法对 SQL 进行优化,无法灵活使用 JDBC 的原生 SQL,Hibernate 封装了 JDBC,所以没有 JDBC 直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用 Hibernate。
- 框架中使用 ORM 原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO 满天飞,性能和维护问题随之而来
- 如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把 lazy 都设置 false,会导致数据查询和加载很慢,尤其是级联查询的时候。
- Hibernate 在批量数据处理时有弱势,对于批量的修改,删除,不适合用 Hibernate,这也是 ORM 框架的弱点。Hibernate 不适用于小型项目。
- 针对单一对象简单的增删查改,适合于 Hibernate,而对于批量的修改,删除,不适合用 Hibernate,这也是 ORM 框架的弱点;要使用数据库的特定优化机制的时候,不适合用 Hibernate。
5 Spring-Data-JPA
ORM 框架。
5.1 使用场景
- 对系统性能没有极致的要求。
- 关注开发效率、开发成本。
- 系统逻辑较简单,没有很多的复杂的SQL。
5.2 优点
- Spring 对 DAO 的高度封装,不需要编写SQL就可以完成大部分业务的数据库操作。
- 内置了基础的数据库操作接口,开发过程中只需要实现定制化的接口即可,大量减少开发的工作量。
- 数据库移植性高。
- 基于 Spring, 目前大部分份系统都会集成 Spring 进行开发,集成方便。
- 使用简单,系统开发成本最低,开发效率完胜其它所有的 ORM 框架。
5.3 缺点
- 对于复杂 sql 编写存在硬编码,且会导致系统风格不统一问题。
- jPA 在性能优化是个问题。
6 Mybatis
半 ORM 框架。
6.1 使用场景
- 对系统数据库方面性能要求高。
- 系统复杂,预估后期经常存在进行数据库 SQL 性能优化的系统。
- 数据库设计中,数据库存在一些大字段,开发过程需要按需查询大字段的场景(Hibernate 或者 Spring Data JPA 会把整个数据库所有字段都查询出来,所以不太适合)。
6.2 优点
- 轻量级的半 ORM 框架,对 JDBC 进行了一定的封装,简单易学。
- SQL 语句单独写在 XML 文件中,不存在这块的硬编码
- 由于 SQL 文件的单独规划,对于系统的 SQL 的性能优化非常的方便。
6.3 缺点
- 所有的 SQL 都需要研发人员进行编写,开发效率比其它的 ORM 框架要低很多。
- 由于 SQL 全是研发人员进行编写的,对于数据库的兼容性比较差,如果一套系统需要同时兼容多款数据库,则需要研发人员同时编写多个不同的数据库对应的语句。
- Mybatis 中的一级缓存与二级缓存,对于现在常规的系统设计(设计上都是使用 redis 等第三方缓存数据库,且缓存方式需要按系统业务规则进行设计,Mybatis 自带的缓存无法应用于各个不同的系统)中有点鸡肋。