`
yingfang05
  • 浏览: 122688 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

数据库相关之精彩的ORM映射框架

    博客分类:
  • ejb3
阅读更多
说起持久层框架或方案,最先想到的肯定是Entity Bean,受过Entity Bean折磨的朋友都知道,其非常的不简单的同时,也非常的不简约。不管是CMP还是BMP的Entity Bean,曾经让J2EE用来作显耀资本的Entity Bean今天回过头去看就像一个怪胎,甚至会有一种让人哭笑不得的感觉。EBJ3.0中推出的JPA,终结了“轻量与重量持久之争”的同时,也宣判了Entity Bean的死刑,基于Entity Bean造价昂贵的系统也成了遗留系统。
  轻量级持久化解决方案设想的萌芽、成形、广泛应用到最终到打败Entity Bean的这一过程,给我们揭示了很多现代科学技术发展的客观规律,我认为其中一个规律可以概括为:“简约而不简单”。通过最简约的表达手段达到最好的表达效果一直是各个不同领域的创造者的目的,软件也不例外同,因此“简约主义(英文:minimalism)”应该是我们软件设计的基本思想之一

  相对于Entity Bean,轻量级持久化方案显得就“简约”了许多。不依赖于任何框架的纯POJO,即方便领域建模,也方便单元测试,更方便移植、维护及扩展。然而,在JDK1.5以前,面对轻量级ORM中的那一堆繁杂的配置文件,如何有效管理却是让人非常头痛;尽管一些ORM系统通过引入Jakarta Commons Attributes或类似的思想来实现源码级标签声明持久层对象映射,零乱的标签定义仍然无法从根本上改善映射属性配置信息管理维护的复杂性。

  JDK1.5以后,注解(Annotation)的引入为我们提供了一种非常好的源码级配置处理方式。因此,在各种项目中得到了非常好的引用,使得持久层的方案更加简约。特别是JPA,可算是“简约”持久层的一个里程碑。因此,现在再来像Spring的Rod Johnson大叔前两年那样再来谈怎么灭掉EJB,难免会有点滑稽可笑。

  Hibernate3.2已经实现了JPA,还有很多的持久层ORM框架也将会实现JPA,因此您如果使用这些框架仍然可以在升级版本中享受其一定的简约。然而“简约”是无尽头的,永远无法轻易达到一种完美的境界,JPA也是如此。

  这里使用EasyDBO框架,举一个简单的例子,来演示“简约”追求的过程。

  可以不需要使用配置文件,直接使用Java注解标签,通过下面的方式定义持久层对象:

  @Table(tableName = " OrderInfo " )

  public class Order implements Serializable {

  @TableField(name = " id " )

  private Number id; // 主键id

  @TableField(name = " sn " )

  private String sn; // 定单编号

  @TableField(name = " vdate " )

  private Date vdate; // 定单日期

  @TableField(name = " requireDate " )

  private Date requireDate; // 交付日期

  @TableField(name = " payType " )

  private String payType; // 支付方式

  @TableField(name = " linkMan " )

  private String linkMan; // 联系人

  @TableField(name = " tel " )

  private String tel; // 电话

  @TableField(name = " address " )

  private String address; // 地址

  @TableField(name = " requirement " )

  private String requirement; // 需求描述

  @TableField(name = " remark " )

  private String remark; // 备注

  @TableField(name = " amount " )

  private BigDecimal amount; // 订单总金额

  @TableField(name = " handPerson " )

  private String handPerson; // 经手人

  @TableField(name = " inputUser " )

  private String inputUser; // 录入人

  @TableField(name = " inputTime " )

  private Date inputTime; // 录入时间

  @TableField(name = " opUser " )

  private String opUser; // 操作人

  @TableField(name = " opIntro " )

  private String opIntro; // 操作简介

  @TableField(name = " opTime " )

  private Date opTime; // 操作时间

  @TableField(name = " status " )

  private Integer status; // 订单状态

  @TableField(name = " payment " )

  private Integer payment; // 支付状态

  @OneToOne(column = " customer_id " , type = Customer. class )

  private Customer customer; // 一对一关联,定单对应的客户

  @ManyToOne(column = " order_id " , type = OrderDetail. class )

  private Set < OrderDetail > children = new HashSet < OrderDetail > (); // 一对多关联,定单下面的详细信息

      public Number getId() {

  return id;

  }

  public void setId(Number id) {

  this .id = id;

  }

  public String getAddress() {

  return address;

  }

  …省略后面普通的getter及setter

  }

  由于不再需要使用配置文件,通过源码级的Java注解标签来标识映射关系,确实要简单多了,而且也非常方便开发工具识别。然而,如果写多了,你会发现,那么多重复的标签,而且大多数内容又相同或类似,依靠代码生成工具总不是办法。比如@TableField(name=”XXX”),其中,XXX有80%以上都是属性的字段的名称,因此ORM系统应该要提供这些默认配置。下面是删除掉所有重复、规律一致标签后的持久层对象Order的改进写法:

  @Table(tableName = " OrderInfo " )

  public class Order implements Serializable {

  @OneToOne(column = " customer_id " , type = Customer. class )

  private Customer customer; // 一对一关联,定单对应的客户

  @ManyToOne(column = " order_id " , type = OrderDetail. class )

  private Set < OrderDetail > children = new HashSet < OrderDetail > (); // 一对多关联,定单下面的详细信息

  private Number id; // 主键id

  private String sn; // 定单编号

  private Date vdate; // 定单日期

  private Date requireDate; // 交付日期

  private String payType; // 支付方式

  private String linkMan; // 联系人

  private String tel; // 电话

  private String address; // 地址

  private String requirement; // 需求描述

  private String remark; // 备注

  private BigDecimal amount; // 订单总金额

  private String handPerson; // 经手人

  private String inputUser; // 录入人

  private Date inputTime; // 录入时间

  private String opUser; // 操作人

  private String opIntro; // 操作简介

  private Date opTime; // 操作时间

  private Integer status; // 订单状态

  private Integer payment; // 支付状态

         public Number getId() {
  return id;

  }

  public void setId(Number id) {

  this .id = id;

  }

  …省略后面普通的getter及setter

  }

  当然,在上面的POJO中,除了一对一、一对多等关联需要进行标注以外,其它的都是使用数据表字段名与对象的属性名相同的映射。追求完美的你还会提出,@OneToOne标签也应该是可省的,另外,表名、多表映射、关联字段等都可以再进一步“简约”,更多复杂(“不简单”)的处理,交由ORM框架来处理。
分享到:
评论

相关推荐

    ORM映射与WEB的应用

    ORM映射,全称为Object-Relational Mapping,是对象...总的来说,ORM映射是Web开发中不可或缺的一部分,它简化了数据库操作,促进了开发效率。正确地理解和运用ORM,能够帮助开发者构建出更加高效、健壮的Web应用程序。

    ORM(关系型数据库与对象映射项目)

    在本项目中,"ORM(关系型数据库与对象映射项目)"可能是实现了一个ORM框架的实例,或者是在一个具体的应用中使用ORM技术进行数据库操作。这个项目可能涵盖了以下几个方面: 1. **类库选择**:项目可能使用了某种流行...

    数据库持久化 ORM 开发框架

    ORM,全称Object-Relational Mapping,即对象关系映射,是一种编程技术,用于将关系数据库的数据映射到对象上,使得开发人员可以使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。 在标题提到的ORM...

    是D编程语言的对象关系映射工具 dlang数据库的对象关系映射ORM框架,支持PostgreSQL和MySQL

    Hunt-entity 是 D 编程语言的对象关系映射工具。dlang 数据库的对象关系映射 (ORM) 框架,支持 PostgreSQL 和 MySQL。

    Spring数据库访问之ORM(三)

    在Spring框架中,数据库访问是核心功能之一,而ORM(对象关系映射)技术则是连接业务逻辑和数据存储的关键桥梁。本篇文章将深入探讨Spring如何实现ORM,主要以JPA(Java Persistence API)和Hibernate为例,同时也会...

    AndroidInject增加sqlite3数据库映射注解(ORM).zip

    总之,通过学习这个项目,开发者可以深入理解Android中SQLite数据库的ORM映射方式,掌握使用注解简化数据库操作的方法,提升Android应用开发的效率。这不仅可以减少代码量,还能降低维护成本,使代码更加清晰、易于...

    Java自定义的类似ORM的数据库操作框架

    Java自定义的类似ORM的数据库操作框架是一种高效且灵活的数据访问解决方案,旨在简化数据库的交互过程,类似于流行的ORM(对象关系映射)框架,如Hibernate和MyBatis。ORM框架的核心理念是将数据库操作转化为面向...

    ORM框架ORM框架ORM框架ORM框架

    ORM(Object-Relational Mapping,对象关系映射)框架是一种软件技术,用于将关系数据库的数据映射到对象上,使得开发者可以使用面向对象的方式来处理数据库操作,而无需直接编写SQL语句。ORM框架的主要目标是简化...

    Android高级应用源码-AndroidInject增加sqlite3数据库映射注解(ORM).rar

    这个压缩包"Android高级应用源码-AndroidInject增加sqlite3数据库映射注解(ORM).rar"提供了一个示例,展示了如何在Android项目中使用SQLite3数据库,并结合ORM(对象关系映射)技术,通过注解的方式简化数据库操作。...

    AndroidInject增加sqlite3数据库映射注解(ORM)

    ORM(Object-Relational Mapping,对象关系映射)技术则简化了数据库操作,将复杂的SQL语句转换为对对象的操作,提高了开发效率。AndroidInject库正是这样一个帮助开发者实现ORM的工具,它允许开发者通过注解来实现...

    ORM对象关系映射

    因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。 ORM 技术包括以下四部分:一个对持久类对象进行 CRUD 操作的 API;一个语言或 API 用来规定与类和类属性相关的...

    国内最受欢迎的ORM框架,支持.NET CORE 和四种数据库,具有EF NH的功能

    ORM(Object-Relational Mapping,对象关系映射)框架是.NET开发者在处理数据库操作时常用的一种工具,它能够将数据库中的数据与程序中的对象进行映射,使得开发者可以使用面向对象的方式来操作数据库,而无需关心...

    其他类别简易数据库关系映射框架EasyDBO

    【标题】"其他类别简易数据库关系映射框架EasyDBO" 涉及的主要知识点是数据库关系映射(ORM)技术。ORM是一种编程技术,它允许开发者使用面向对象的编程语言来操作数据库,通过在对象和数据库表之间建立映射,从而...

    golang常用库之操作数据库的orm框架-gorm基本使用详解

    golang常用库:操作数据库的orm框架-gorm基本使用 一:字段映射-模型定义 gorm中通常用struct来映射字段. gorm教程中叫模型定义 比如我们定义一个模型Model: type User struct { gorm.Model UserId int64 `gorm:...

    ibatis半自动化orm映射

    标题 "ibatis半自动化ORM映射" 涉及的核心技术是iBatis,这是一个流行的Java数据访问框架,用于实现对象关系映射(ORM)。ORM的主要目标是将数据库操作与业务逻辑解耦,使得开发人员可以更专注于业务代码,而无需...

    orm 映射工具

    NHibernate是一个开源的ORM框架,它提供了对.NET应用程序和各种关系型数据库之间的映射功能。通过NHibernate,开发人员可以将数据库中的表映射到C#类,这些类可以直接操作,而无需编写大量的SQL语句。 映射过程主要...

    Android高级应用源码-AndroidInject增加sqlite3数据库映射注解(ORM).zip

    这个压缩包"Android高级应用源码-AndroidInject增加sqlite3数据库映射注解(ORM).zip"提供了一个示例,展示了如何在Android项目中使用SQLite3数据库,并通过ORM(对象关系映射)技术来简化数据库操作。ORM允许开发者...

    基于ORM的数据库框架Room

    **基于ORM的数据库框架Room** 在Android开发中,数据存储是一个关键部分,而Room数据库框架是Google官方推荐的用于Android应用程序的数据持久化解决方案。Room基于对象关系映射(ORM)理念,它允许开发者以更面向...

    sqlite3的ORM框架

    3. **映射机制**:ORM框架会有一个内部机制,用于将类的实例与数据库表记录进行映射。这包括字段名的映射、主键的处理、自增字段的管理等。 4. **CRUD操作**:ORM框架提供插入(Create)、读取(Read)、更新...

    AndroidInject增加sqlite3数据库映射注解(ORM).rar

    本话题主要探讨如何在Android中使用SQLite数据库,并通过AndroidInject库和sqlite3注解实现对象关系映射(ORM),以简化数据库操作。ORM允许开发者用面向对象的方式来处理数据库,而无需直接编写SQL语句,提高了代码...

Global site tag (gtag.js) - Google Analytics