V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
anonymoustian
V2EX  ›  程序员

谁能通俗地讲解一下 ORM 框架具体是什么,以及相关的案例?

  •  
  •   anonymoustian · 2017-01-13 10:12:30 +08:00 · 7173 次点击
    这是一个创建于 2864 天前的主题,其中的信息可能已经有所发展或是发生改变。

    天天看大家说 ORM ORM 但是 ORM 具体是什么好像也没说明白,谁能通俗解释下呢

    23 条回复    2017-01-16 17:23:19 +08:00
    wshcdr
        1
    wshcdr  
       2017-01-13 10:14:21 +08:00
    具体的案例就是比如 java 中的 Hibernate
    LancerXin
        2
    LancerXin  
       2017-01-13 10:20:06 +08:00
    可以很方便的将数据库里的数据读取出来放在内存里,
    顺便将数据帮你转换成 bean 之类的,
    顺便帮你管理一下数据库的事务之类的.
    然后可以很方便的扩展查询条件的样子......
    haozhang
        3
    haozhang  
       2017-01-13 10:20:35 +08:00 via iPhone   ❤️ 1
    将所有的数据持久化相关的工作全部转成对象操作,屏蔽底层数据库的细节。
    echo1937
        4
    echo1937  
       2017-01-13 10:24:48 +08:00   ❤️ 1
    * OOP 的世界和 RDBMS 的鸿沟
    *
    * OOP 的世界中数据是对象
    * RDBMS 中数据是行列二元表

    * ORM(Object/Relation Mapping)
    *
    * 持久化类和 table 之间的映射关系
    * 对持久化对象的操作自动转换成对关系数据库操作
    * RDBMS 的每一行映射为每一个对象
    * RDBMS 的每一列映射为对象的每一个属性

    ORM 帮助你在对象和记录之间做映射,你就可以继续愉快地操作你熟悉的对象了。
    q397064399
        5
    q397064399  
       2017-01-13 10:32:42 +08:00   ❤️ 1
    简而言之就是

    将对象集合 映射成 数据库行列
    将对对象的操作 映射成 SQL 语句

    就这么简单,一般 ORM 框架自带多种自定义接口,
    很多的常见需求的 SQL 都不用自己写,调接口就是了, JPA 规范里面 可以直接写就接口,然后让框架帮你
    生成 SQL

    优点:可以偷懒 省事 省时
    缺点:复杂的查询就歇菜了, Hibernate 必备的技能就是 注入实体管理器,然后手动 SQL 组装对象,类似 Mybatis
    zvving
        6
    zvving  
       2017-01-13 10:53:31 +08:00
    首先你要知道 ORM 的缩写是什么;
    其次你要知道怎么在开发语言( java , python )中写 SQL 操作数据库;
    感觉写起来不大方便是吧,选个 ORM 框架试试。

    话说回来,如果真的不知道 ORM 缩写是什么就来提问……有些不负责任呀。
    syasuker
        7
    syasuker  
       2017-01-13 10:58:18 +08:00
    对象关系映射(英语: Object Relational Mapping ,简称 ORM ,或 O/RM ,或 O/R mapping ),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

    对于 Java 来说就是 Entity,将数据库中的字段对应到一个对象上
    jswh
        8
    jswh  
       2017-01-13 11:00:45 +08:00   ❤️ 1
    gino86
        9
    gino86  
       2017-01-13 13:43:19 +08:00
    简单来说就是把一个对象中的属性值写入数据库对应列的中间件
    wizardoz
        10
    wizardoz  
       2017-01-13 13:57:48 +08:00   ❤️ 1
    ORM 就是将数据库的数据抽象成 编程语言中的对象.

    就好有个学生表
    没有 ORM 的时候是
    select age,sex,degree,.... from student where name = "李刚"
    查询出的结果可能是个字符串,你要去你面解析你要的内容.

    有了 ORM 以后可能是这样:
    obj_ligang = TStudent.objects.get(name="李刚")
    然后就
    print(obj_ligang.age, obj_ligang.sex, obj_ligang.degree)
    AlisaDestiny
        11
    AlisaDestiny  
       2017-01-13 14:02:50 +08:00
    @jswh 这个站长真是有点意思。
    ytmsdy
        12
    ytmsdy  
       2017-01-13 14:22:36 +08:00
    通俗一点说,就是相当于你跑了一个内存数据库。
    dexterzzz
        13
    dexterzzz  
       2017-01-13 14:26:50 +08:00
    LINQ
    WangXg
        14
    WangXg  
       2017-01-13 17:13:41 +08:00
    @ytmsdy 哈哈,挺形象
    clino
        15
    clino  
       2017-01-13 17:25:06 +08:00
    python 里的例子就是 sqlalchemy
    使用的例子如 uliweb 里的 uliorm 默认用 sqlalchemy 作为 orm 引擎: http://limodou.github.io/uliweb-doc/zh_CN/db/orm.html
    darrenfang
        16
    darrenfang  
       2017-01-13 18:41:35 +08:00 via iPhone
    @jswh 这个网站真好😂
    lightening
        17
    lightening  
       2017-01-13 20:58:55 +08:00


    UPDATE Customers
    SET City='Hamburg'
    WHERE id=1;

    改成这样写:

    customer = Customer.find_by(id: 1)
    customer.city = 'Hamburg'
    customer.save
    izoabr
        18
    izoabr  
       2017-01-13 22:49:15 +08:00
    你不再需要自己去操作 SQL 了,而是在操作一个对象。
    slysly759
        19
    slysly759  
       2017-01-14 00:06:48 +08:00 via Android   ❤️ 1
    跟着廖雪峰教程用 Python 手写一个,这样会理解更深入一些。我在博客上提到过用 orm 的一优势:比如避免 SQL 语句满天飞, web SQL 注入到处跑等等。
    andreby
        20
    andreby  
       2017-01-14 21:34:14 +08:00
    object relation mapping 啊
    abcbuzhiming
        21
    abcbuzhiming  
       2017-01-14 22:03:55 +08:00
    想把关系数据库的模型映射为对象模型,别说这招在很多场合是适用的,因为实际上我们在大多数时候不需要强关系模型,但是,复杂关系查询就完蛋了
    anonymoustian
        22
    anonymoustian  
    OP
       2017-01-15 11:24:51 +08:00
    @abcbuzhiming 请问什么叫做强关系模型呢?
    abcbuzhiming
        23
    abcbuzhiming  
       2017-01-16 17:23:19 +08:00
    @anonymoustian 关系数据库最早的需求来源就是金融业,这个领域的数据的一致性和实时性要求非常高,各种约束,这就是关系数据库的早期场景,可以看做是强关系模型,但是后来到了互联网时代,没有这么严格的数据校验需求,或者说,互联网时代的数据没有这么严格的需求,倒是很多用关系数据库的互联网项目把外键都去掉,甚至数据一致性和唯一性放在程序做校验,数据库单纯作为数据仓库使用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2776 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:53 · PVG 22:53 · LAX 06:53 · JFK 09:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.