什么是对象关系映射框架?

时间:2009-07-20 08:25:16

标签: orm

正如标题所说;什么是ORM框架?它有什么用?

8 个答案:

答案 0 :(得分:246)

一个简单的答案是,您可以使用编程语言将表或存储过程包装在类中,这样就可以使用对象的方法和属性来代替编写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在典型函数上有不同的名称,以及使用日期进行计算的不同方法,因此查询“让我所有人在过去24小时内编辑”可能需要针对这两个数据库引擎的不同SQL语法。这种差异可以远离逻辑代码。

此外,您可以专注于编写逻辑,而不是让所有SQL正确。代码通常也更具可读性,因为它不包含与数据库通信所需的所有“管道”。

答案 1 :(得分:47)

From wikipedia

  

对象关系映射(ORM,O / RM,   和计算机软件中的O / R映射   是一种编程技术   在不兼容之间转换数据   在关系数据库中键入系统   和面向对象的编程   语言。这实际上创造了一个   “虚拟对象数据库”即可   在编程中使用   语言。有免费和   可用的商业套餐   执行对象关系映射,   虽然有些程序员选择   创建自己的ORM工具。

最好抽象出数据存储区(平面文件/ SQL /等),以便提供可在代码中使用的接口。例如,(在rails中)而不是构造SQL来查找users表中的第一个用户,我们可以这样做:

User.first

这将返回我们的用户模型的实例,其中包含users表中第一个用户的属性。

答案 2 :(得分:9)

数据库通常用于关系模型:你有表(简化:像电子表格),以及它们之间的关系 - 一对一,一对多,多对多等等,这意味着例如表A中的一条记录在表B中有许多相关记录。您可以从它们中检索数据作为行(表示表/表中行的值的集合)More in wikipedia

现代编程语言使用对象模型。对象具有方法,属性(简单或复杂)等。

ORM软件在这些模型之间进行转换。例如,它将表B中的所有相关记录放入对象A的属性中。这种软件使得使用对象编程语言更容易使用关系数据库(最流行的类型)。

答案 3 :(得分:6)

每当你使用ORM(对象关系映射器)时,你会发现DBAL(数据库抽象层)并排。因此,有必要了解这些是什么,以便获得您正在使用的内容的良好见解,并了解您将获得的优势。

DBAL(数据库抽象层)

它充当代码和数据库之间的层。无论你的数据库是什么,编写的代码都可以很好地进行微调。

假设对于当前项目,您使用MySQL一旦完全成熟并获得巨大流量,您的团队计划将数据库切换到Oracle由于某种原因,那么您在MySQL中编写的代码必须重写为基于Oracle的查询。重写整个项目的查询是一项繁琐的工作。

相反,如果您使用任何DBAL库,那么您可以切换数据库的配置,并确保您的项目将在一天内启动并运行(可能需要进行一些小的调整)。

ORM(对象关系映射器)

对象关系映射(ORM)是一种从面向对象语言访问关系数据库的技术(设计模式)。

如果您使用过任何类型的框架,如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);

EG。 DoctrinePropelRedBean

答案 4 :(得分:2)

ORM是:

抽象,就像任何抽象一样,它让你的生活更轻松。

答案 5 :(得分:0)

来自维基百科: http://en.wikipedia.org/wiki/Object-relational_mapping

计算机软件中的对象关系映射(ORM,O / RM和O / R映射)是一种用于在关系数据库和面向对象编程语言中的不兼容类型系统之间转换数据的编程技术。这实际上创建了可以在编程语言中使用的“虚拟对象数据库”。尽管有些程序员选择创建自己的ORM工具,但有可用的免费和商业软件包可以执行对象关系映射。

利弊 ORM通常会减少需要编写的代码量,使软件更加健壮(程序中的代码行越少,其中包含的错误就越少)。[1]。

使用O / R映射有成本和好处。例如,一些O / R映射工具在批量删除数据期间表现不佳。存储过程可能具有更好的性能,但不可移植。

答案 6 :(得分:0)

它允许你做这样的事情(这是Doctrine代码):

$activeUsers = Doctrine::getTable('User')->createQuery('u')->addWhere('u.active = false');
foreach($activeUsers as $user)
{
   $user->active = true;
   $user->save();
}

答案 7 :(得分:0)

对象关系映射(ORM)库提供了数据库表到域对象类的映射。