ORM 是 Object Relational Mapping 的缩写,译为“对象关系映射”框架。
所谓的 ORM 框架就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过形容 Java 对象与数据库表之间的映射关系,主动将 Java 应用程序中的对象长久化到关系型数据库的表中。
ORM 框架是一种数据长久化技术,即在对象模型和关系型数据库之间建设起对应关系,并且提供一种机制,可通过 JavaBean 对象操作数据库表中的数据。
在理论开发中,程序员应用面向对象的技术操作数据,而存储数据时,应用的却是关系型数据库,这样就造成了很多不便。ORM 能够在对象模型和关系型数据库的表之间建设一座桥梁,程序员应用 API 间接操作 JavaBean 对象就能够实现数据的存储、查问、更改和删除等操作。
MyBatis 框架通过简略的 XML 或注解进行配置和原始映射,将实体类和 SQL 语句之间建设起映射关系,是一种半自动化的 ORM 实现。
支流的 Java ORM 框架
以后 Java ORM 框架产品有很多,常见的框架有 Hibernate 和 MyBatis,其次要区别如下。
1) Hibernate
Hibernate 框架是一个全表映射的框架。通常开发者只有定义好长久化对象到数据库表的映射关系,就能够通过 Hibernate 框架提供的办法实现长久层操作。
开发者并不需要熟练地把握 SQL 语句的编写,Hibernate 框架会依据编制的存储逻辑,主动生成对应的 SQL,并调用 JDBC 接口来执行,所以其开发效率会高于 MyBatis 框架。
然而 Hibernate 框架本身也存在一些毛病,例如:
多表关联时,对 SQL 查问的反对较差;更新数据时,须要发送所有字段;不反对存储过程;不能通过优化 SQL 来优化性能。
这些问题导致其只适宜在场景不太简单且对性能要求不高的我的项目中应用。
Hibernate 官网:http://hibernate.org/
2) MyBatis
MyBatis 框架是一个半自动映射的框架。这里所谓的“半自动”是绝对于 Hibernate 框架全表映射而言的,MyBatis 框架须要手动匹配提供 POJO、SQL 和映射关系,而 Hibernate 框架只需提供 POJO 和映射关系即可。
与 Hibernate 框架相比,尽管应用 MyBatis 框架手动编写 SQL 要比应用 Hibernate 框架的工作量大,但 MyBatis 框架能够配置动静 SQL 并优化 SQL、通过配置决定 SQL 的映射规定,以及反对存储过程等。对于一些简单的和须要优化性能的我的项目来说,显然应用 MyBatis 框架更加适合。
MyBatis 框架可利用于需要多变的互联网我的项目,如电商我的项目;Hibernate 框架可利用于需要明确、业务固定的我的项目,如 OA 我的项目、ERP 我的项目等。
3) gaarason
让连贯数据库以及对数据库进行增删改查操作变得非常简单,不管心愿应用原生 SQL、还是查问结构器,还是 Eloquent ORM。
Eloquent ORM 提供一个好看、简略的与数据库打交道的 ActiveRecord 实现,每个数据表都对应一个与该表数据结构对应的实体(Entity),以及的进行交互的模型(Model),通过模型类,你能够对数据表进行查问、插入、更新、删除等操作,并将后果反映到实体实例化的 java 对象中。
对于关联关系 Eloquent ORM 提供了富裕表现力的申明形式,与简洁的应用办法,并专一在外部进行查问与内存优化,在简单的关系中有依然有着良好的体验。
兼容于其余常见的 ORM 框架, 以及常见的数据源 (DataSource)
// 查问 id 为 4 的一条数据 select * from student where id = 4 limit 1
Student student = studentModel.find(4).toObject();
// 表达式列名格调 select name,age from student where id in (1,2,3)
List<Student> Students = studentModel.newQuery().whereIn(Student::getId, 1,2,3)
.select(Student::getName).select(Student::getAge)
.get().toObjectList();
// 稍简单嵌套的语句 select id,name from student where id=3 or(age>11 and id=7 and(id between 4 and 10 and age>11))
List<Student> Students = studentModel.newQuery().where("id", "3").orWhere(builder -> builder.where("age", ">", "11").where("id", "7").andWhere(builder2 -> builder2.whereBetween("id", "4", "10").where("age", ">", "11")
)
).select("id", "name").get().toObjectList();
// 关联查问 找出学生们的老师们的父亲们的那些房子
List<Student> Students = studentModel.newQuery().whereIn("id", "1","2","3").get().with("teacher.father.house").toObjectList();
// 减少关联 给 id 为 8 的学生减少 3 名老师 (id 别离为 1,2,3)
studentModel.findOrFail(8).bind("teachers").attach(teacherModel.findMany(1,2,3) );
gaarason 中文文档:https://github.com/gaarason/d…
4) spring data JPA
spirng data jpa 是 spring 提供的一套简化 JPA 开发的框架,依照约定好的【办法命名规定】写 dao 层接口,就能够在不写接口实现的状况下,实现对数据库的拜访和操作。同时提供了很多除了 CRUD 之外的性能,如分页、排序、简单查问等等。
Spring Data JPA 能够了解为 JPA 标准的再次封装形象,底层还是应用了 Hibernate 的 JPA 技术实现。