当前位置:天才代写 > tutorial > JAVA 教程 > Java数据工具技能JDO简介

Java数据工具技能JDO简介

2017-11-11 08:00 星期六 所属: JAVA 教程 浏览:303

副标题#e#

作为异军突起的新型语言,Java界说了一个尺度的运行情况,用户界说的类在个中获得执行。这些用户自界说类的实例代表了真实情况中的数据,包罗储存在数据库、文件或某些大型事务处理惩罚系统中的数据,而小型系统凡是也需要一种在当地认真节制数据存储的机制。

由于数据会见技能在差异的数据源范例中是纷歧样的,因此对数据举办会见成了给措施开拓人员的一种挑战,措施员需要对每一种范例的数据源利用特定的编程接口(API),即必需至少知道两种语言来基于这些数据源开拓业务应用:Java语言和由数据源所抉择的数据会见语言。这种数据会见语言一般按照数据源的差异而差异,这使得进修利用某种数据源的开拓本钱相应晋升。

在Java数据工具技能(JDO)宣布之前,凡是有三种方法用于存储Java数据:串行化(即Serialization,也称序列化)、JDBC和EJB中的CMP(容控存储)方法。串行化用于将某个工具的状态,以及它所指向的其它工具布局图全部写到一个输出流中(好比文件、网络等等),它担保了被写入的工具之间的干系,这样一来,在另一时刻,这个工具布局图可以完整地从头结构出来。但串行化不支持事务处理惩罚、查询可能向差异的用户共享数据。它只答允在最初串行化时的粒度(指会见工具的接口风雅水平)基本长举办会见,而且当应用中需要处理惩罚多种或多次串行化时很难维护。串行化只合用于最简朴的应用,可能在某些无法有效地支持数据库的嵌入式系统中。

JDBC要求你明晰地处理惩罚数据字段,而且将它们映射到干系数据库的表中。开拓人员被迫与两种区别很是大的数据模子、语言和数据会见手段打交道:Java,以及SQL中的干系数据模子。在开拓中实现从干系数据模子到Java工具模子的映射是如此的巨大,乃至于大都开拓人员从不为数据界说工具模子;他们只是简朴地编写进程化的Java代码来对底层的干系数据库中的数据表举办哄骗。最终功效是:他们基础不能从面向工具的开拓中获得任何长处。

EJB组件体系是被设计为支持漫衍式工具计较的。它也包罗对容器打点一连性Container Managed Persistence(拜见术语表)的支持来实现一连性。主要由于它们的漫衍式特性,EJB应用比起JDO来巨大得多,对资源的耗损也大得多。不外,JDO被设计成具有必然的机动性,这样一来,JDO产物都可以用来在底层实现EJB的存储处理惩罚,从而与EJB容器团结起来。假如你的应用需要工具存储,但不需要漫衍式的特性,你可以利用JDO来取代EJB组件。在EJB情况中最典范的JDO利用方案就是让EJB中的对话组件(Session Bean)直接会见JDO工具,制止利用实体组件(Entity Bean)。EJB组件必需运行在一个受控(Managed,拜见术语表)的应用处事情况。但JDO应用可以运行在受控情况中,也可以运行在不受控的独立情况中,这些使你可以机动地选择最符合的应用运行情况。

假如你将精神会合在设计Java工具模子上,然后用JDO来举办存储你的数据类的实例,你将大大提跨越产力和开拓效率。你只需要处理惩罚一种信息模子。而JDBC则要求你领略干系模子和SQL语言(译者注:JDO并不是要代替JDBC,而是成立在JDBC基本上的一个抽象的中间层,提供更简朴的数据存储接口)。纵然是在利用EJB CMP(即容控存储,拜见术语表)的时候,你也不得不进修与EJB体系相关的很多其它方面的内容,而且在建模方面尚有一些JDO中不存在的范围性。

JDO类型了JDO运行情况和你的可存储工具类之间的约定。JDO被设计成支持多种数据源,包罗一般环境下思量不到的数据库之类的数据源。以后刻开始,我们利用数据库(拜见术语表)这一观念来暗示任何你通过JDO来会见的底层数据源。

本章将会展开接头JDO的根基本领,这些基于对一个虚拟的Media Mania公司所开拓的一个小型应用举办细致的阐明。这个公司在遍布美国的许多商店中出租和出售多种形式的娱乐音像产物。他们的商店中有一些售货亭,提供一些影戏以及影戏中的演员的信息。这些信息对客户和商店的职员开放,以辅佐选择适合客户口胃的商品。

界说数据工具模子

我们将成立一个UML类图,显示一个公司的工具模子的相关类以及彼此之间的干系。一个Movie(影戏)工具暗示一部特定的影戏。每个至少在一部影戏中出演脚色的演员由一个Actor(演员)工具代表。而Role(脚色)类暗示某个演员在某部影戏中饰演的特定脚色,因此Role类也暗示了影戏和演员之间的一种干系,这种干系包括一个属性(影戏中的脚色名)。每部影戏包括一到多个脚色。每个演员可以在差异的影戏中饰演差异的脚色,甚至在同一部影戏中饰演多个脚色。

我们会将这些数据类以及哄骗这些数据类实例的的措施放到com.mecdiamania.prototype包中。


#p#副标题#e#

需要存储的类

#p#分页标题#e#

我们界说Movie、Actor和Role这几个类为可一连的,暗示它们的实例是可以被储存到数据库中的。首先我们看看每个类的完整的源代码。每个类中有一个package语句,因此可以很清楚地看到本例用到的每个种别离在哪个包中。

例1-1显示了Movie类的源代码。JDO是界说在javax.jdo包中的,留意这个类并不必然要导入任何详细的JDO类。Java中的引用和java.util包中的Collection及相关子类(接口)被用来暗示我们的类之间的干系,这是大大都Java应用中的尺度方法。

Movie类中的属性利用Java中的尺度范例,如String、Date、int等等。你可以将属性声明为private的,不需要对每一属性界说相应的get和set要领。Movie类中尚有一些用于会见这些私有属性的要领,尽量这些要领在措施中的其它部门会用到,但它们并不是JDO所要求的。你可以利用属性包装来提供仅仅是抽象建模所需要的要领。这个类尚有一些静态属性(static的),这些属性并不存储到数据库。

"genres"属性是一个String型的,内容是该影戏所属的影戏气势气魄(行动、恋爱、诡异等等)。一个Set接口用来暗示该影戏的演员表中的脚色荟萃。"addRole()"要领将元素插手到演员表中,而"getCast()"要领返回一个不行以变动的荟萃,该荟萃中包括演员表。这些要领并不是JDO划定的,只是为了利便应用编程而编写的。"parseReleaseDate()"要领和"formatReleaseDate()"要领用于将影戏的刊行日期尺度化(名目化)。为了保持代码的简朴,假如parseReleaseDate()的参数名目差池,将会返回null。

例1-1 Movie.java

package com.mediamania.prototype;
import java.util.Set;
import java.util.HashSet;
import java.util.Collections;
import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.text.ParsePosition;
public class Movie {
   private static SimpleDateFormat yearFmt = new SimpleDateFormat("yyyy");
   public static final String[] MPAAratings = {
     "G", "PG", "PG-13", "R", "NC-17", "NR"};
   private String title;
   private Date releaseDate;
   private int runningTime;
   private String rating;
   private String webSite;
   private String genres;
   private Set cast; // element type: Role
   private Movie() {}
   public Movie(String title, Date release, int duration, String rating,
         String genres) {
     this.title = title;
     releaseDate = release;
     runningTime = duration;
     this.rating = rating;
     this.genres = genres;
     cast = new HashSet();
   }
   public String getTitle() {
     return title;
   }
   public Date getReleaseDate() {
     return releaseDate;
   }
   public String getRating() {
     return rating;
   }
   public int getRunningTime() {
     return runningTime;
   }
   public void setWebSite(String site) {
     webSite = site;
   }
   public String getWebSite() {
     return webSite;
   }
   public String getGenres() {
     return genres;
   }
   public void addRole(Role role) {
     cast.add(role);
   }
   public Set getCast() {
     return Collections.unmodifiableSet(cast);
   }
   public static Date parseReleaseDate(String val) {
     Date date = null;
     try {
       date = yearFmt.parse(val);
     } catch (java.text.ParseException exc) {}
     return date;
   }
   public String formatReleaseDate() {
     return yearFmt.format(releaseDate);
   }
}

JDO对一个需要存储的类强加了一个要求:一个无参数的结构器。假如你在类代码中不界说任何结构器,编译器会自动发生一个无参数的结构器;而假如你界说了带参结构器,你就必需再界说一个无参结构器,可以将其声明为private以克制外部会见。假如你不界说这个无参结构器,一些JDO产物会自动为你发生一个,但这只是详细的JDO产物提供的成果,是不行移植的。

 

    关键字:

天才代写-代写联系方式