持久化框架的使用背景
什么是持久化(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能适应基本上所有数据源。
根据我们公司的情况,mybatis-plus是最好的选择。
连接池说明
mybatis默认采用的是当前性能最高的HikariCP,所以使用默认的即可;
hibernate默认使用的c3p0连接池,性能相比于其他还是比较弱,建议更换为HikariCP或者druid;
数据库连接池性能对比
常见数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)链接地址