什么是对象关系映射框架?
正如标题所说; 什么是ORM框架,它有什么用处?
从维基百科 :
计算机软件中的对象关系映射(ORM,O / RM和O / R映射)是用于在关系数据库和面向对象编程语言中的不兼容types系统之间转换数据的编程技术。 这实际上创build了一个可以在编程语言中使用的“虚拟对象数据库”。 虽然有些程序员select创build他们自己的ORM工具,但有免费的和商业的软件包可以执行对象关系映射。
为了提供一个可以在你的代码中使用的接口,抽象数据存储(平面文件/ SQL /其他)是很好的。 例如(在rails中)而不是构造SQL来查找用户表中的第一个用户,我们可以这样做:
User.first
这将返回我们的用户模型的一个实例,用户表中的第一个用户的属性。
一个简单的答案是,用编程语言将类或存储过程封装在类中,这样就不用编写SQL语句来与数据库交互,而是使用对象的方法和属性。
换句话说,而不是像这样的东西:
String sql = "SELECT ... FROM persons WHERE id = 10" DbCommand cmd = new DbCommand(connection, sql); Result res = cmd.Execute(); String name = res[0]["FIRST_NAME"];
你做这样的事情:
Person p = repository.GetPerson(10); String name = p.FirstName;
或类似的代码(在这里有很多变化)。一些框架也把类似的静态方法放在代码中,这意味着你可以这样做:
Person p = Person.Get(10);
一些还实现了复杂的查询系统,所以你可以这样做:
Person p = Person.Get(Person.Properties.Id == 10);
该框架是使这个代码成为可能的。
现在,好处。 首先,你将SQL从你的逻辑代码中隐藏起来。 这有利于您更轻松地支持更多的数据库引擎。 例如,MS SQL Server和Oracle在典型函数上有不同的名称,用不同的方法来计算date,所以“让我所有人在过去的24小时内编辑”的查询可能需要不同的SQL语法,仅用于这两个数据库引擎。 这种差异可以放在您的逻辑代码。
另外,你可以专注于编写逻辑,而不是让所有的SQL都正确。 代码通常也更易读,因为它不包含与数据库交谈所需的所有“pipe道”。
数据库通常在关系模型上工作:你有表(简化:就像电子表格一样),以及它们之间的关系 – 一对一,一对多,多对多等,这意味着例如一个logging表A在表B中有许多相关的logging。你可以从它们中检索数据作为行(表示来自表/表的行的值的集合) 更多wikipedia 。
现代的编程语言使用对象模型。 对象有方法,属性(简单或复杂)等
ORM软件会在这些模型之间进行转换。 例如,它将来自表B的所有相关logging放入对象A的属性中。这种软件使得使用对象编程语言的关系数据库(最stream行的types)更容易。
ORM是:
抽象和抽象一样,它使生活更轻松。
每当你用ORM(对象关系映射器)去,你会发现DBAL(数据库抽象层)并排。 所以它有必要知道这些是什么,以获得你正在使用什么和你会得到什么好处。
DBAL(数据库抽象层)
它充当代码和数据库之间的层。 不pipe你的数据库是什么,写的代码都可以正常工作,只需稍作调整。
假设对于当前的项目,您使用MySQL一旦完全成熟并获得巨大的stream量,您的团队计划将数据库切换到Oracle出于某种原因,那么您在MySQL中编写的代码必须重写为基于Oracle的查询。 重写整个项目的查询是一个乏味的任务。
相反,如果你使用任何DBAL库,那么你可以切换数据库的configuration,并确保你的项目将在一天内运行(可能会稍微调整)。
ORM(对象关系映射器)
对象关系映射(ORM)是一种从面向对象语言访问关系数据库的技术(devise模式)。
如果你已经使用了像Symfony(如果你来自PHP背景)/ Hibernate(Java)的任何一种框架,那么你熟悉这些。 它只是实体 。
为了在面向对象的上下文中访问数据库并进行接口转换,需要对象逻辑,这个接口被称为ORM。 它构成了访问数据并保持业务规则的对象。
例如。
class User{ private $email; private $password; public function setEmail($email){ $this->email = $email; return $this; } public function getEmail(){ return $this->email; } public function setPassword($password){ $this->password = $password; return $this; } public function getPassword(){ return $this->password; } } /* To save User details you would do something like this */ $userObj = new User(); $userObj->setEmail('sanitizedEmail'); $userObj->setPassword('sanitizedPassword'); $userObj->save(); /* To fetch user details you would do something like this */ $userObj = new User(); $userDetails = $userObj->find($id);
例如。 学说 , 推动 , 红豆
从维基百科: http : //en.wikipedia.org/wiki/Object-relational_mapping
计算机软件中的对象关系映射(ORM,O / RM和O / R映射)是用于在关系数据库和面向对象编程语言中的不兼容types系统之间转换数据的编程技术。 这实际上创build了一个可以在编程语言中使用的“虚拟对象数据库”。 虽然有些程序员select创build他们自己的ORM工具,但有免费的和商业的软件包可以执行对象关系映射。
优点和缺点ORM通常会减less需要编写的代码量,从而使软件更健壮(程序中的代码行越less,其中包含的错误越less)[1]。
使用O / R映射有成本和好处。 例如,一些O / R映射工具在批量删除数据时performance不佳。 存储过程可能会有更好的性能,但不是可移植的。
它允许你做这样的事情(这是学说代码):
$activeUsers = Doctrine::getTable('User')->createQuery('u')->addWhere('u.active = false'); foreach($activeUsers as $user) { $user->active = true; $user->save(); }
对象关系映射(ORM)库提供数据库表到域对象类的映射。
- @ManyToOne(可选= false)和@Column(nullable = false)之间有什么区别?
- SQL Alchemy ORM返回单个列,如何避免常见的后期处理
- 当插入一个实体的关联,有没有办法只是使用FK而不是检索实体?
- 绕过Hibernate中的GeneratedValue(合并数据不在数据库?)
- 使用Django的ORM加速批量插入?
- JPA中的@Basic(可选= false)vs @Column(nullable = false)
- 如何configurationSQL Server的hibernateconfiguration文件
- Grails领域类:多列的唯一约束
- 什么是一些好的Python ORM解决scheme?