当前位置: 首页 > 工具软件 > mybatis-jpa > 使用案例 >

持久化框架选型对比,包含JdbcTemplate、JPA、hibernate、Mybatis、Mybatis-plus

韦宏扬
2023-12-01

持久化框架的使用背景

什么是持久化(Persistence)?
持久化是把存在于内存中临时易变的(Transient)的数据保存到可永久保存的存储设备中,这个存储设备可以是硬盘,也可以是数据库等。
对于本职工作来说 JDBC 就可以很好的完成,但是当我们对持久化的需求变得更复杂时,例如:
编写规范、编写可读性、重复利用、延迟加载、预先抓取、级联、缓存、解耦合、高性能等时,原生JDBC就不能满足需求了,所以我们需要使用各类框架,来达到简单操作持久层数据的目的;

框架名称业务入侵性灵活性学习成本大量数据插入性能重复率sql维护成本
JDBC超高超高超高
JdbcTemplate超高较低超高
JPA较低较高
hibernate较低
Mybatis较低较低较高
Mybatis-plus

JdbcTemplate

jdbcTemplate是jdbc的封装模板,jdbcTemplate 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.

缺点

sql的编写依然是原生写法,每次实现都需要实现sql编写;
数据库操作基本都是写在了业务层,和业务耦合性很强;
有sql注入的风险,编写时一不小心就容易发生;

Hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

优点

hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql;
功能强大,数据库无关性好,O/R映射能力强,需要写的代码很少,开发速度很快,代码部署运维难度降低;
数据库移植性良好,hql基本上可以适用于现在主流的数据库上。
非侵入式:Hibernate不要求持久化类实现任何接口或继承任何类,POJO即可。

缺点

学习成本高,需要深入学习hql、多种缓存机制和相关O/R映射关系;
不易排查问题,mybatis-plus在开发阶段能开启sql查询日志,排查问题更方便;
操作较局限,缺少灵活性,当有复杂的操作时,基本也会走query方式,sql的灵活度上hibernate不及mybatis;

JPA

JPA的总体思想和现有hibernate等ORM框架大体一致,Jpa是一种规范,Hibernate的jpa是以它为基础的一种增强实现;JPA能配合hibernate更好的发挥作用,一般在使用hibernate时都会使用到jpa,生成具有关联关系的表;但随着时代发展,表与表之间的数据约束已经不需要通过数据库层面进行限定,而是通过业务逻辑进行保证,所以优势不大;

Mybatis

mybatis是Clinton Begin在2001年发起的一个开源项目。最初侧重于码软件开发,后续发展成为一款基于java的持久层框架。Mybatis是一款优秀的持久层框架支持自定义SQL查询、存储过程和高级映射,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用简单的XML或者注解进行映射和配置,通过将参数映射到配置的SQL最终解析为执行的SQL语句,查询后将SQl结果集映射成java对象返回。MyBatis提供的持久层框架包括SQL Maps(Mapper)和Data Access Objects(DAO),相对于Hibernate而言它提供的是一种把反自动化的ORM实现。

优点

操作简单:mybatis是最简单的持久化框架,小巧简单易学;
解耦合:mybatis灵活,SQL写在XML里面,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用;
灵活:提供多种XML标签,支持各种场景的动态SQL拼接编写,基本能应付所有的操作场景,提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)
专注:mybatis可以让开发者专注于SQL本身,是一个足够灵活的DAO层解决方案;
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

缺点

半编程:mybatis属于半编程模式,基本的增删改次都需要使用者自己写XML实现(当然支持注解方式);
xml编写稍复杂:SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求;
移植性差:Mybatis中XML写的SQL依赖数据库,数据库移植性差,比如mysql变为oracle时,xml里面的写法就需要做相应改变;

Mybatis-plus

Mybatis-plus是MyBatis的增强工具,旨在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。

优点

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑;
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作;
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求;
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,通过实体获取查询字段,无需再担心字段写错;
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用;
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询,分页插件支持多种数据库;
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询;
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作;
缺点
移植性稍差:单表单crud移植方便,但Mybatis中XML写的SQL依赖数据库,数据库移植性差,比如mysql变为oracle时,xml里面的写法就需要做相应改变;

学习文档

mybatis-plus官方文档学习链接

总结

各位可以根据项目需求来合理选择对应框架,对于性能要求高的底层应用,用近原生的JdbcTemplate也许会让项目性能有所提高;
mybatis-plus根据具体项目情况选取:

正常项目选用mybatis-plus,他相对于JdbcTemplate、jpa、JDBC,各项功能支持更强大,功能扩展更广,封装够使用更简单;相对于hibernate灵活性更高,学习成本更低,上手更容易,提供的附加功能更完善,例如分页;
若项目后续明确知道持久层会对接多种不同的数据源,那么毋庸置疑的选择hibernate,因为hql能适应基本上所有数据源。

 类似资料: