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

持久化框架的使用背景

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

提前给出对比表格

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

JdbcTemplate

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

缺点

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

Hibernate

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

优点

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

缺点

  1. 学习成本高,需要深入学习hql、多种缓存机制和相关O/R映射关系;
  2. 不易排查问题,mybatis-plus在开发阶段能开启sql查询日志,排查问题更方便;
  3. 操作较局限,缺少灵活性,当有复杂的操作时,基本也会走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实现。

优点

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

缺点

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

Mybatis-plus

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

优点

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

缺点

  1. 移植性稍差:单表单crud移植方便,但Mybatis中XML写的SQL依赖数据库,数据库移植性差,比如mysql变为oracle时,xml里面的写法就需要做相应改变;

学习文档

mybatis-plus官方文档学习链接

总结

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

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

连接池说明

mybatis默认采用的是当前性能最高的HikariCP,所以使用默认的即可;
hibernate默认使用的c3p0连接池,性能相比于其他还是比较弱,建议更换为HikariCP或者druid;

数据库连接池性能对比

常见数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)链接地址

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值