`
Eric_liu
  • 浏览: 90651 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

以前搜集的java名词解释汇总

阅读更多
什么是 DTO?
DTO就是Data Transfer Object,数据传输对象。DTO主要负责client(WEB层)和业务层的数据传递。DTO简单的就是一些Java类型,比如:String,Integer,甚至List,Map等,更多就是POJO了,用属性承载数据。虽然只有属性的DTO被一些大师如Martin Fowler认为是“贫血的”,但我认为DTO很好的履行了它的职责:描述业务接口,传输业务数据。

什么是 POJO?
POJO是Plain Old Java Object,它的产生源于Bussiness Ojbect的实现,相对应的技术有Entity Bean。可以作为一种轻量级的业务对象模型。这个在Hibernate当中得到应用,并且EJB3.0的规范里也增加POJO作为相应的部分。
简单的说 就是 只有getter,setter以及简单的参数处理,没有具体业务逻辑的java类.

什么是ORM?
   O/R Mapping -- Object Relational Mapping(对象关系映射)的缩写. 对象角色建模(ORM)提供了概念性的、易于理解的模型化数据的方法。ORM方法论基于三个核心原则:

  · 简单。以最基本的形式建模数据。
  · 传达性。数据库结构被任何人都能理解的语言文档化。
  · 精确性。基于数据模型创建正确标准化了的结构。

  典型地,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发信息模型。建模者必须能够用非技术企业专家可以理解的术语在概念层次上与数据结构进行通讯。建模者也必须能以简单的单元分析信息,对样本数据进行处理。ORM专门被设计为改进这种联系。

  规则表达式

  ORM把应用程序世界表示为具有角色(关系中的部分)的一组对象(实体或值)。ORM有时也称为基于事实的建模,因为它把相关数据描述为基本事实。这些事实如果分割为再小的事实就会丢失信息。
简单事实的一些例子包括:

  · 人有电话
  · 人住在某个地方
  · 人生于某个日期
  · 人在某个日期被雇佣

  这些事实相应的ORM模型如下:


图 1. 对象角色模型

  图中的圆代表对象;矩形代表论断。在ORM中,象在逻辑中一样,一个论断只是带有对象洞的语句。箭头和点代表系统中的约束。

  例如,在"人有电话"这个事实的诊断上的箭头可以翻译为:

  有可能某个人有多于一个电话,并且至少有一个人有电话。

  在"人生于某个日期"这个事实中,在论断上的箭头与连接对象与论断的点的结合表明:

  每个人确切地出生于一个日期。

  与 ER的比较

  实体关系(ER)是另一种类型的数据库建模。ORM模型的简单性与ER相应部分的比较:



图 2. 实体关系

  ORM以简单对象和论断的形式描述企业事实,而实体关系方法论以术语实体(拥有属性并参与关系)描述世界。在图1的ORM例子中,人,电话,地址和日期都表示为扮演有相互联系的角色的对象。在ER例子中,人是一个实体,它由属性:地址和电话进行描述。

  例如,如果要把地址分解为街道,城市,州,ZIP码,那么必须把地址改变为具有相应属性的实体类型,结果会改变人与地址间的关系。尽管在上面的ORM模型中表示的约束也可以在ER中表示,但只要向模型中增加节点,或编写应用程序代码对模型进行补充,就可以表示其它约束。

  ORM的优点

  ORM提供的不只是描述不同对象间关系的一个简单而直接的方式。从示例中,可以看出ORM还提供了灵活性。使用ORM创建的模型比使用其它方法创建的模型更有能力适应系统的变化。另外,ORM允许非技术企业专家按样本数据谈论模型,因此他们可以使用真实世界的数据验证模型。因为ORM允许重用对象,数据模型能自动映射到正确标准化的数据库结构。

  ORM模型的简单性简化了数据库查询过程。使用ORM查询工具,用户可以访问期望数据,而不必理解数据库的底层结构。

  数据库生成和遍历引挚

  象所有优秀的模型方法一样,ORM也不只是一个概念。它包含了不同的设计过程以帮助建模者映射概念的和逻辑的模型,或使用转换引挚在这些模型间转换。

  ORM模型也能够自动地映射到大多数流行的关系型数据库所实现的数据库结构。检查前面的例子,ORM模型能自动生成ER图表或逻辑模型(可以翻译为SQL 代码,并适用于所选择的数据库)。

  总结

  利用非技术企业专家的知识对于确保应用程序满足企业需求是重要的。ORM,Visual Studio .NET的一个特性,是一个最初的、易于使用的概念性数据模型方法。通过使用不只是只有数据库专家才能理解的语言,ORM使那些充分理解了企业对应用程序需求的人能直接参与设计。

  ORM还支持完全的遍历引挚,因此一旦定义了企业需求,它们就能迅速的转化为逻辑和物理数据库图表。使用ORM,组织可以提高应用程序开发的效率,确保企业需求能被正确交付。
论坛竟然不支持图片 0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" align=absMiddle border=0>

VO与PO的概念
O/R Mapping -- Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据绑定,用对象来表示关系数据。如图:


VO -- Value Object 值对象。
PO -- Persistent Object 持久对象。


它们的基本形式和写法如下:

public class User {
    private String id;
    private String name;

    public void setId(String argId) {
        this.id = argId;
    }

    public String getId() {
        return this.id;
    }

    public void setName(String argName) {
        this.name = argName;
    }

    public String getName() {
        return this.Name;
    }
}

虽然它们的形式与写法基本相同,但意义却大不相同。
1.VO是用new关键字创建,由GC回收的。
   PO是向数据库中添加新数据时创建,删除数据库中数据时删除的。并且它只能存活在一个数据库连接中,当连接断开时,将被销毁。
2.VO是值对象,精确点讲它是业务对象,是存活在业务层的,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方。
   PO是有状态的,每个属性代表其当前的状态。它是物理数据的对象表示。使用它,可以使我们的程序与物理数据解耦,并且可以简化对象数据与物理数据之间的转换。
3.VO的属性是根据当前业务的不同而不同的,也就是说,它的每一个属性都一一对应当前业务逻辑所需要的数据的名称。
   PO的属性是跟数据库表的字段一一对应的。


OSIV:Open Session In View,在B/S系统中通常采用这种方式来更好的去支持Lazy
load,意思就是在View 加载前打开Session,在View 加载完毕后关闭Session 的方
式,在Spring中有OpenSessionInViewFilter,可参考或直接使用。

转自javaeye
pojo 与po 的概念

POJO = pure old java object or plain ordinary java object or what ever.

PO = persisent object 持久对象

就是说在一些Object/Relation Mapping工具中,能够做到维护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。全都是这样子的:


java代码:  

public class User {
  private long id;
  private String name;
  public void setId(long id) {
this.id = id;
}  
public void setName(String name) {
this.name=name;
}
public long getId() {
return id;
}  
public String getName() {
return name;
}
}



---------------------------------------------------------------------------
首先要区别持久对象和POJO。

持久对象实际上必须对应数据库中的entity,所以和POJO有所区别。比如说POJO是由new创建,由GC回收。但是持久对象是insert数据库创建,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象往往只能存在一个数据库Connection之中,Connnection关闭以后,持久对象就不存在了,而POJO只要不被GC回收,总是存在的。

由于存在诸多差别,因此持久对象PO(Persistent Object)在代码上肯定和POJO不同,起码PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。而ORM追求的目标就是要PO在使用上尽量和POJO一致,对于程序员来说,他们可以把PO当做POJO来用,而感觉不到PO的存在。

JDO的实现方法是这样的:
1、编写POJO
2、编译POJO
3、使用JDO的一个专门工具,叫做Enhancer,一般是一个命令行程序,手工运行,或者在ant脚本里面运行,对POJO的class文件处理一下,把POJO替换成同名的PO。
4、在运行期运行的实际上是PO,而不是POJO。

该方法有点类似于JSP,JSP也是在编译期被转换成Servlet来运行的,在运行期实际上运行的是Servlet,而不是JSP。

Hibernate的实现方法比较先进:
1、编写POJO
2、编译POJO
3、直接运行,在运行期,由Hibernate的CGLIB动态把POJO转换为PO。

由此可以看出Hibernate是在运行期把POJO的字节码转换为PO的,而JDO是在编译期转换的。一般认为JDO的方式效率会稍高,毕竟是编译期转换嘛。但是Hibernate的作者Gavin King说CGLIB的效率非常之高,运行期的PO的字节码生成速度非常之快,效率损失几乎可以忽略不计。

实际上运行期生成PO的好处非常大,这样对于程序员来说,是无法接触到PO的,PO对他们来说完全透明。可以更加自由的以POJO的概念操纵PO。另外由于是运行期生成PO,所以可以支持增量编译,增量调试。而JDO则无法做到这一点。实际上已经有很多人在抱怨JDO的编译期Enhancer问题了,而据说JBossDO将采用运行期生成PO字节码,而不采用编译期生成PO字节码。

另外一个相关的问题是,不同的JDO产品的Enhancer生成的PO字节码可能会有所不同,可能会影响在JDO产品之间的可移植性,这一点有点类似EJB的可移植性难题。

-----------------------------------------------------------------------------------
由这个问题另外引出一个JDO的缺陷。

由于JDO的PO状态管理方式,所以当你在程序里面get/set的时候,实际上不是从PO的实例中取values,而是从JDO StateManager中取出来,所以一旦PM关闭,PO就不能进行存取了。

在JDO中,也可以通过一些办法使得PO可以在PM外面使用,比如说定义PO是transient的,但是该PO在PM关闭后就没有PO identity了。无法进行跨PM的状态管理。

而Hibernate是从PO实例中取values的,所以即使Session关闭,也一样可以get/set,可以进行跨Session的状态管理。

在分多层的应用中,由于持久层和业务层和web层都是分开的,此时Hibernate的PO完全可以当做一个POJO来用,也就是当做一个VO,在各层间自由传递,而不用去管Session是开还是关。如果你把这个POJO序列化的话,甚至可以用在分布式环境中。(不适合lazy loading的情况)

但是JDO的PO在PM关闭后就不能再用了,所以必须在PM关闭前把PO拷贝一份VO,把VO传递给业务层和web层使用。在非分布式环境中,也可以使用ThreadLocal模式确保PM始终是打开状态,来避免每次必须进行PO到VO的拷贝操作。但是不管怎么说,这总是权宜之计,不如Hibernate的功能强。



什么是持久化和对象关系映射ORM技术?
何谓“持久化”
持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
何谓“持久层”
持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。

何谓“对象数据映射(ORM)”
ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。

备注:建模领域中的 ORM 为 Object/Role Modeling(对象角色建模)。另外这里是“O/R Mapper”而非“O/R Mapping”。相对来讲,O/R Mapping 描述的是一种设计思想或者实现机制,而 O/R Mapper指以O/R原理设计的持久化框架(Framework),包括 O/R机制还有 SQL自生成,事务处理,Cache管理等。


除了 ORM 技术,还有以下几种持久化技术

主动域对象模式
它是在实现中封装了关系数据模型和数据访问细节的一种形式。在 J2EE 架构中,EJB 组件分为会话 EJB 和实体 EJB。会话 EJB 通常实现业务逻辑,而实体 EJB 表示业务实体。实体 EJB 又分为两种:由 EJB 本身管理持久化,即 BMP(Bean-Managed Persistence);有 EJB 容器管理持久化,即 CMP(Container-Managed Persistence)。BM P就是主动域对象模式的一个例子,BMP 表示由实体 EJB 自身管理数据访问细节。
主动域对象本身位于业务逻辑层,因此采用主动域对象模式时,整个应用仍然是三层应用结构,并没有从业务逻辑层分离出独立的持久化层。

JDO 模式
Java Data Objects(JDO)是 SUN 公司制定的描述对象持久化语义的标准API。严格的说,JDO 并不是对象-关系映射接口,因为它支持把对象持久化到任意一种存储系统中,包括 关系数据库、面向对象的数据库、基于 XML 的数据库,以及其他专有存储系统。由于关系数据库是目前最流行的存储系统,许多 JDO 的实现都包含了对象-关系映射服务。

CMP 模式
在 J2EE 架构中,CMP(Container-Managed Persistence)表示由 EJB 容器来管理实体 EJB 的持久化,EJB 容器封装了对象-关系的映射及数据访问细节。CMP 和 ORM 的相似之处在于,两者都提供对象-关系映射服务,都把对象持久化的任务从业务逻辑中分离出来。区别在于 CMP 负责持久化实体 EJB 组件,而 ORM 负责持久化 POJO,它是普通的基于 Java Bean 形式的实体域对象。

一般把基于 Java Bean 形式的实体域对象称为 POJO(Plain Old Java Object),意为又普通又古老的 Java 对象的意思。随着各种 ORM 映射工具的日趋成熟和流行,POJO有重现光彩,它和基于 CMP 的实体 EJB 相比,即简单又具有很高的可移植性,因此联合使用 ORM 映射工具和 POJO,已经成为一种越来越受欢迎的且用来取代 CMP 的持久化方案。POJO 的缺点就是无法做远程调用,不支持分布式计算。


为什么要做持久化和ORM设计

在目前的企业应用系统设计中,MVC,即 Model(模型)- View(视图)- Control(控制)为主要的系统架构模式。MVC 中的 Model 包含了复杂的业务逻辑和数据逻辑,以及数据存取机制(如 JDBC的连接、SQL生成和Statement创建、还有ResultSet结果集的读取等)等。将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。MVC 模式实现了架构上将表现层(即View)和数据处理层(即Model)分离的解耦合,而持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。而 ORM 作为持久化设计中的最重要也最复杂的技术,也是目前业界热点技术。

简单来说,按通常的系统设计,使用 JDBC 操作数据库,业务处理逻辑和数据存取逻辑是混杂在一起的。
一般基本都是如下几个步骤:
1、建立数据库连接,获得 Connection 对象。
2、根据用户的输入组装查询 SQL 语句。
3、根据 SQL 语句建立 Statement 对象 或者 PreparedStatement 对象。
4、用 Connection 对象执行 SQL语句,获得结果集 ResultSet 对象。
5、然后一条一条读取结果集 ResultSet 对象中的数据。
6、根据读取到的数据,按特定的业务逻辑进行计算。
7、根据计算得到的结果再组装更新 SQL 语句。
8、再使用 Connection 对象执行更新 SQL 语句,以更新数据库中的数据。
7、最后依次关闭各个 Statement 对象和 Connection 对象。

由上可看出代码逻辑非常复杂,这还不包括某条语句执行失败的处理逻辑。其中的业务处理逻辑和数据存取逻辑完全混杂在一块。而一个完整的系统要包含成千上万个这样重复的而又混杂的处理过程,假如要对其中某些业务逻辑或者一些相关联的业务流程做修改,要改动的代码量将不可想象。另一方面,假如要换数据库产品或者运行环境也可能是个不可能完成的任务。而用户的运行环境和要求却千差万别,我们不可能为每一个用户每一种运行环境设计一套一样的系统。
所以就要将一样的处理代码即业务逻辑和可能不一样的处理即数据存取逻辑分离开来,另一方面,关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO.NET、JDBC、ODBC等等)均是以行集的结果集一条条进行处理的。所以为解决这一困难,就出现 ORM 这一个对象和数据之间映射技术。

举例来说,比如要完成一个购物打折促销的程序,用 ORM 思想将如下实现(引自《深入浅出Hibernate》):
业务逻辑如下:
public Double calcAmount(String customerid, double amount)
{
    // 根据客户ID获得客户记录
    Customer customer = CustomerManager.getCustomer(custmerid);
    // 根据客户等级获得打折规则
    Promotion promotion = PromotionManager.getPromotion(customer.getLevel());
    // 累积客户总消费额,并保存累计结果
    customer.setSumAmount(customer.getSumAmount().add(amount);
    CustomerManager.save(customer);
    // 返回打折后的金额
    return amount.multiply(protomtion.getRatio());
}
这样代码就非常清晰了,而且与数据存取逻辑完全分离。设计业务逻辑代码的时候完全不需要考虑数据库JDBC的那些千篇一律的操作,而将它交给 CustomerManager 和 PromotionManager 两个类去完成。这就是一个简单的 ORM 设计,实际的 ORM 实现框架比这个要复杂的多。


目前有哪些流行的 ORM 产品
目前众多厂商和开源社区都提供了持久层框架的实现,常见的有
Apache OJB (http://db.apache.org/ojb/
Cayenne (http://objectstyle.org/cayenne/
Jaxor (http://jaxor.sourceforge.net
Hibernate (http://www.hibernate.org
iBatis (http://www.ibatis.com
jRelationalFramework (http://ijf.sourceforge.net
mirage (http://itor.cq2.org/en/oss/mirage/toon
SMYLE (http://www.drjava.de/smyle
TopLink (http://otn.oracle.com/products/ias/toplink/index.html
其中 TopLink 是 Oracle 的商业产品,其他均为开源项目。

其中 Hibernate 的轻量级 ORM 模型逐步确立了在 Java ORM 架构中领导地位,甚至取代复杂而又繁琐的 EJB 模型而成为事实上的 Java ORM 工业标准。而且其中的许多设计均被 J2EE 标准组织吸纳而成为最新 EJB 3.0 规范的标准,这也是开源项目影响工业领域标准的有力见证。
分享到:
评论

相关推荐

    java名词的解释用于解释java名词

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年发布。它以其“一次编写,...通过阅读“java-名词解释.doc”文档,你可以获得更详细的信息和实例,进一步提升你的Java知识。

    efk7.13搜集java日志-filebeat配置详解

    efk7.13搜集java日志—filebeat配置详解笔记总结

    java面试题汇总java笔试题大集合及答案题库java笔试题汇总资料超过100个合集

    面试中,面试官可能要求解释JVM的内存结构(堆、栈、方法区、本地方法栈、程序计数器),垃圾收集算法(如新生代、老年代、CMS、G1),以及如何进行性能调优(如JVM参数设置、监控工具如VisualVM的使用)。...

    Java虚拟机解释执行机制研究.pdf

    JVM解释执行机制是Java虚拟机执行字节码的一种方式,其中解释器将Java字节码逐条转换成机器码并执行。 Java语言的跨平台特性得益于其编译后不是直接生成特定平台上的机器码,而是生成一种中间形式的字节码。Java源...

    Java基础知识点总结.docx

    设计模式是解决常见软件设计问题的经验总结,如单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式、适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、享元模式、代理模式、责任链模式、...

    Java面试汇总.pdf+总结全面+八股文

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~博主已将这些面试题整理到一个网站上,每天更新 Java 面试题,目前有 1万多道 Java 高频面试题。...

    Java项目经验汇总.doc

    在本篇文档中,我们将对提到的多个Java项目进行详细的经验总结,涵盖多个领域的系统开发,包括企业资源规划(ERP)、网上商城、物流管理、教育信息化以及气象服务等多个行业。 首先,2015年4月至12月,参与了中卫...

    java毕业设计论文总结.doc

    "Java毕业设计论文总结.doc" _java 语言的出现_ Java 语言的出现是为了解决网络计算模式下的科学计算和信息处理问题,而 Java 语言和 Java 技术则是解决这一问题的最佳途径。在 1991 年,SUN 公司的 Jame Gosling,...

    Java知识点总结文档

    Java知识点总结文档全面涵盖了多个Java相关的技术领域,包括JVM、Java集合框架、多线程并发、基础语法、Spring框架的原理、微服务、Netty与RPC通信、网络编程、日志管理、分布式协调工具Zookeeper、大数据存储系统如...

    6个Java程序员的年度总结-精

    标题中的“6个Java程序员的年度总结-精”意味着这是一份包含六个Java程序员在过去一年中关于编程工作、学习和成长的总结性文档。这些程序员可能是来自不同背景、经验水平和项目领域的专家,他们分享了他们的知识、...

    最新Java面试八股文10万字总结

    这份"最新Java面试八股文10万字总结"包含了全面的Java知识体系,旨在帮助求职者准备面试,提升对Java技术的理解。 首先,基础篇涵盖了Java语言的基础语法,包括变量、数据类型、运算符、流程控制(如if语句、switch...

    Java最新面试总结.docx

    ### Java最新面试总结知识点 #### 一、面向对象分析(OOA) 面向对象分析(OOA)是在系统开发过程中的一个重要阶段,它基于系统业务调查资料,并采用面向对象的思想来进行分析工作。OOA的主要任务是从收集到的信息...

    java 笔试题汇总

    Java笔试题汇总是一份集合了众多Java编程基础知识和进阶技术的题目集合,旨在帮助学习者和求职者全面复习和检验自己的Java技能。这个压缩包可能包含了大量的Java面试和笔试常见问题,涵盖了从基础语法、面向对象编程...

    Java面试题大汇总宝典

    "Java面试题大汇总宝典"是一个精心整理的资源集合,旨在帮助求职者充分准备面试,增加成功获得理想职位的机会。 1. **Java核心基础**: - **数据类型与变量**:Java分为基本数据类型(如int、float)和引用数据...

    java项目总结报告.pdf

    "java项目总结报告.pdf" 本资源是关于 Java 项目开发的总结报告,涵盖了项目的设计、实施和测试等方面的内容。报告中提到项目的主要目标是设计一个企业级的人力资源系统,分为十个子系统,其中包括机构编制管理、...

    JAVA多线程总结

    【JAVA多线程总结】 Java 多线程是Java编程中的关键特性,它允许程序同时执行多个任务,提高系统的效率和响应性。本篇总结涵盖了Java多线程的基础概念、创建与启动、线程调度、同步与协作以及新特性。 **一、Java...

    Java编程单词汇总,分25天

    以下是对标题和描述中提及的一些关键知识点的详细解释: 1. **JDK (Java Development Kit)**:Java开发工具包,是Java程序员开发Java应用程序的基础,包含了编译器、调试器、文档生成工具等。 2. **JRE (Java ...

    java问题汇总(学习JAVA必看)

    9. **JVM内存管理**:理解Java虚拟机(JVM)的工作原理,包括内存区域(如堆、栈、方法区)、垃圾收集机制和内存溢出问题,有助于优化应用程序性能。 10. **设计模式**:设计模式是解决常见软件设计问题的最佳实践...

    JAVA程序的总结和提升

    开发者无需手动进行内存分配和释放,但了解其工作原理,如可达性分析和垃圾收集器的类型,可以帮助优化程序性能。 字符串在Java中是不可变的,这意味着一旦创建了字符串对象,就不能更改其内容。判断两个字符串是否...

    Java面试题汇总.pdf

    Java的健壮性主要体现在它的强类型机制、异常处理以及垃圾自动收集等方面,这有助于减少内存泄漏和其他运行时错误。安全性方面,Java在设计时就考虑到了安全性问题,提供了一系列安全特性,包括类加载器的安全机制和...

Global site tag (gtag.js) - Google Analytics