【1】Mybatis
官网地址:https://github.com/mybatis/mybatis-3
① 概要
MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
mybatis原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis ,代码于2013年11月迁移到Github(下载地址见后)。
iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
当前,最新版本是MyBatis 3.5.7 ,其发布时间是2021年4月21日。
② mybatis的功能结构
Mybatis的功能架构可以分为三层:
API接口层
提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层
负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑
③ 为什么使用mybatis
MyBatis是一个半自动化
的持久化层框架。
JDBC
–SQL夹在Java代码块里,耦合度高导致硬编码内伤
–维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
Hibernate和JPA
–长难复杂SQL,对于Hibernate而言处理也不容易
–内部自动生产的SQL,不容易做特殊优化。
–基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降。
对开发人员而言,核心sql还是需要自己优化
灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql。
【2】Hibernate
官网地址:http://hibernate.org/orm/
中文文档:https://hibernate.net.cn/
① 概要
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架。hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JavaEE架构中取代CMP,完成数据持久化的重任。
Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。hibernate工作原理
1、通过Configuration().configure();//读取并解析hibernate.cfg.xml配置文件。 2、由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>//读取解析映射信息。 3、通过config.buildSessionFactory();//得到sessionFactory。 4、sessionFactory.openSession();//得到session。 5、session.beginTransaction();//开启事务。 6、persistent operate; //持久化层操作 7、session.getTransaction().commit();//提交事务 8、关闭session; 9、关闭sessionFactory;
② 为什么使用hibernate
封装了jdbc,简化了很多重复性代码。
简化了DAO层编码工作,使开发更对象化了,
移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了(改变数据库方言),不用改变hibernate代码。
支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。所以说它是一个轻量级框架。Hibernate不要求持久化类实现任何接口或继承任何类,POJO即可
【3】Spring Data JPA
官网地址:https://docs.spring.io/spring-data/jpa/docs/2.5.2/reference/html/#preface
① 概要
jpa,即Java Persistence API,是用于对象持久化的API。Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层。也就是说,JPA是一组规范,不是框架!默认实现框架是Hibernate。
JPA包含三方面技术
ORM 映射元数据
JPA 支持 XML 和 JDK 5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
JPA 的 API
用来操作实体对象,执行CRUD操作,框架在后台完成所有的事情,开发者从繁琐的 JDBC和 SQL代码中解脱出来。
查询语言(JPQL)
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序和具体的 SQL 紧密耦合。
jpa与hibernate关系
JPA 是 hibernate 的一个抽象(就像JDBC和JDBC驱动的关系),JPA 本质上就是一种 ORM 规范,不是ORM 框架 —— 因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由 ORM 厂商提供实现
Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现。从功能上来说, JPA 是 Hibernate 功能的一个子集。
JPA 的目标之一是制定一个可以由很多供应商实现的 API,目前Hibernate 3.2+、TopLink 10.1+ 以及 OpenJPA 都提供了 JPA 的实现。
Hibernate JPA 的始作俑者就是 Hibernate 的作者 Hibernate 从 3.2 开始兼容 JPA OpenJPA OpenJPA 是 Apache 组织提供的开源项目 TopLink TopLink 以前需要收费,如今开源了
② 为什么使用Spring Data JPA
标准化
JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
简单易用,集成方便
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易地掌握。JPA基于非侵入式原则设计,因此可以很容易地和其它框架或者容器集成。
可媲美JDBC的查询能力
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
支持面向对象的高级特性
JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。
【4】Mybatis Plus
官网文档:https://mp.baomidou.com/guide/
① 概要
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
框架结构如下:
② 特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作