ORM简介
ORM:对象关系映射:Object Relational Mapping
用于实现面向对象编程语言里不同类型系统的数据之间的转换
一般的,数据库绝大部分是面向关系的数据库,但是写代码的时候是用类,对象这种,而关系则不好用高级语言表示。所以经常需要把类跟表相互转化。
- 类和表结构对应
- 属性和字段对应
- 对象和记录对应
当没有ORM的时候我们是这样完成对象与关系数据库之间的映射的:
//将执行的sql
String sql = "SELECT name, id, age, password FROM users";
//创建命令对象
preparedStatement = connection.prepareStatement(sql);
//执行并获得结果集
resultSet = preparedStatement.executeQuery();
//遍历结果集,将数据库中的数据转换成Java中的对象
while(resultSet.next()){
String name = resultSet.getString("name");
int id = resultSet.getInt("id");
int age = resultSet.getInt("age");
String password = resultSet.getString("password");
User entity= new User(name,id,age,password);
Users.add(entity);
}
这段代码非常眼熟,就是Java课上写的代码。
但是这种写法有很多弊端:
- 持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口
- 持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,都要修改持久化曾的相关程序代码,增加了软件的维护难度。
- 将和数据库交互(CRUD)的代码硬编码到JDBC程序中
- 实现见状的持久化层需要高超的开发技巧,而且编程量很大
- 对象模型和关系模型的转换非常麻烦
上面说的可能很难理解,换一种思路。
如果说上面代码类的属性多一个“hobby”,那么就读取不到,还必须加上相关的代码,形容一下就是原来的代码是死的,原来的代码是采取一种硬编码的方式,那么相对应的,我们需要一个“活代码”。
ORM(O/R Mapping:对象关系映射)
- 它是一种将内存中的对象保存到关系型数据库中的技术
- 主要负责实体域对象的持久化,封装数据库访问细节
- 提供了实现持久化层的另一种模式,采用映射元数据(XML)来描述对象-关系的映射细节,使得ORM中间件能在任何一个Java应用的业务逻辑层和数据库之间充当桥梁。
上面这些暂时不懂,但是有个重要的框架mybatis,这是马上要学习的东西。
mybatis
先来看看mybatis的部分优点:
- 灵活,不会对应用程序或者数据库现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用
- 提供XML标签,支持编写动态SQL语句。
- 提供映射标签,支持对象与数据库的ORM字段关系映射
如果不分离的话,那就是上面所说的硬编码的形式,硬编码程序的维护性是非常差的。
如果分离出来,java只是读取XML里的SQL语句,不需要再去改JAVA了。
解耦合的方法非常重要!
ORM的优缺点
优势
第一:隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
第二:ORM使我们构造固化数据结构变得简单易行。在ORM年表的史前时代,我们需要将我们的对象模型转化为一条一条的SQL语句,通过直连或是DB helper在关系数据库构造我们的数据库体系。而现在,基本上所有的ORM框架都提供了通过对象模型构造关系数据库结构的功能。这,相当不错。
缺点
第一:无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
第二:面向对象的查询语言(X-QL)作为一种数据库与对象之间的过渡,虽然隐藏了数据层面的业务抽象,但并不能完全的屏蔽掉数据库层的设计,并且无疑将增加学习成本.
第三:对于复杂查询,ORM仍然力不从心。虽然可以实现,但是不值的。视图可以解决大部分calculated column,case ,group,having,order by, exists,但是查询条件(a and b and not c and (d or d))。
世上没有驴是不吃草的(又想好又想巧,买个老驴不吃草),任何优势的背后都隐藏着缺点,这是不可避免的。问题在于,我们是否能容忍缺点。
常用的ORM框架
hibernate:全自动的框架,强大、复杂、笨重、学习成本较高
Mybatis:半自动的框架(懂数据库的人 才能操作) 必须要自己写sql
JPA:JPA全称Java Persistence API、JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,是Java自带的框架
本文参考
[1]: https://www.cnblogs.com/weibanggang/p/10167006.html
[2]: https://blog.csdn.net/cillyb/article/details/79464374