[Java-基础] 什么是ORM

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课上写的代码。

但是这种写法有很多弊端:

  1. 持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口
  2. 持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,都要修改持久化曾的相关程序代码,增加了软件的维护难度。
  3. 将和数据库交互(CRUD)的代码硬编码到JDBC程序中
  4. 实现见状的持久化层需要高超的开发技巧,而且编程量很大
  5. 对象模型和关系模型的转换非常麻烦

上面说的可能很难理解,换一种思路。

如果说上面代码类的属性多一个“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

原文地址:https://www.cnblogs.com/smallocean/p/12354594.html