WEB开发网      婵犵數濮烽弫鍛婄箾閳ь剚绻涙担鍐叉搐绾剧懓鈹戦悩瀹犲闁汇倗鍋撻妵鍕箛閸洘顎嶉梺绋款儑閸犳劙濡甸崟顖氬唨闁靛ě浣插亾閹烘鈷掗柛鏇ㄥ亜椤忣參鏌″畝瀣暠閾伙絽銆掑鐓庣仭缁楁垿姊绘担绛嬪殭婵﹫绠撻、姘愁樄婵犫偓娴g硶鏀介柣妯款嚋瀹搞儱螖閻樺弶鍟炵紒鍌氱Ч瀹曟粏顦寸痪鎯с偢瀵爼宕煎☉妯侯瀳缂備焦顨嗗畝鎼佸蓟閻旈鏆嬮柣妤€鐗嗗▓妤呮⒑鐠団€虫灀闁哄懐濮撮悾鐤亹閹烘繃鏅濋梺闈涚墕濡瑩顢欒箛鏃傜瘈闁汇垽娼ф禒锕傛煕閵娿儳鍩f鐐村姍楠炴﹢顢欓懖鈺嬬幢闂備浇顫夊畷妯肩矓椤旇¥浜归柟鐑樻尭娴滃綊姊虹紒妯虹仸闁挎洍鏅涜灋闁告洦鍨遍埛鎴︽煙閼测晛浠滃┑鈥炽偢閹鈽夐幒鎾寸彇缂備緡鍠栭鍛搭敇閸忕厧绶炴俊顖滅帛濞呭洭姊绘担鐟邦嚋缂佽鍊垮缁樼節閸ャ劍娅囬梺绋挎湰缁嬫捇宕㈤悽鍛婄厽閹兼番鍨婚埊鏇㈡煥濮樿埖鐓熼煫鍥ュ劤缁嬭崵绱掔紒妯肩畺缂佺粯绻堝畷姗€濡歌缁辨繈姊绘担绛嬪殐闁搞劋鍗冲畷顖炲级閹寸姵娈鹃梺缁樻⒒閳峰牓寮崒鐐寸厱闁抽敮鍋撻柡鍛懅濡叉劕螣鐞涒剝鏂€闂佺粯鍔曞Ο濠囧吹閻斿皝鏀芥い鏃囨閸斻倝鎽堕悙鐑樼厱闁哄洢鍔屾晶顖炴煕濞嗗繒绠婚柡灞界Ч瀹曨偊宕熼鈧▍锝囩磽娴f彃浜炬繝銏f硾椤戝洨绮绘ィ鍐╃厵閻庢稒岣跨粻姗€鏌ㄥ☉妯夹fい銊e劦閹瑩顢旈崟顓濈礄闂備浇顕栭崰鏍礊婵犲倻鏆﹂柟顖炲亰濡茶鈹戦埄鍐ㄧ祷妞ゎ厾鍏樺璇测槈閵忕姈鈺呮煏婢跺牆鍔撮柛鏂款槺缁辨挻鎷呯粙搴撳亾閸濄儳鐭撶憸鐗堝笒閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓 ---闂傚倸鍊搁崐鐑芥倿閿旈敮鍋撶粭娑樺幘濞差亜鐓涢柛娑卞幘椤斿棝姊虹捄銊ユ珢闁瑰嚖鎷�
开发学院WEB开发Jsp JAVA使用XML作为持久存储介质实现方法 阅读

JAVA使用XML作为持久存储介质实现方法

 2008-01-05 20:37:00 来源:WEB开发网 闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷闂傚倸鍊搁崐椋庣矆娓氣偓楠炲鏁撻悩鎻掔€梺姹囧灩閻忔艾鐣烽弻銉︾厵闁规鍠栭。濂告煕鎼达紕校闁靛洤瀚伴獮鎺楀箣濠靛啫浜鹃柣銏⑶圭壕濠氭煙閻愵剚鐏辨俊鎻掔墛缁绘盯宕卞Δ鍐冣剝绻涘畝濠佺敖缂佽鲸鎹囧畷鎺戭潩閹典焦鐎搁梻浣烘嚀閸ゆ牠骞忛敓锟�婵犵數濮烽弫鍛婃叏椤撱垹绠柛鎰靛枛瀹告繃銇勯幘瀵哥畼闁硅娲熷缁樼瑹閳ь剙岣胯鐓ら柕鍫濇偪濞差亜惟闁宠桨鑳堕崝锕€顪冮妶鍡楃瑐闁煎啿鐖奸崺濠囧即閵忥紕鍘梺鎼炲劗閺呮稒绂掕缁辨帗娼忛埡浣锋闂佽桨鐒﹂幑鍥极閹剧粯鏅搁柨鐕傛嫹闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷  闂傚倸鍊搁崐鐑芥嚄閼哥數浠氱紓鍌欒兌缁垶銆冮崨鏉戠厺鐎广儱顦崡鎶芥煏韫囨洖校闁诲寒鍓熷铏圭磼濡搫顫岄梺鍦拡閸嬪棝鎯€椤忓浂妯勯梺鍝勬湰濞叉ḿ鎹㈠┑濠勭杸闁哄洨濮烽悰銉╂⒒娴e搫甯跺鐟帮攻缁傚秴饪伴崼姘e亾閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡涱€楀褜鍠栭湁闁绘ɑ鐟ョ€氼喚绮绘ィ鍐╃厱妞ゆ劑鍊曢弸搴ㄦ煟韫囧鍔滈柕鍥у瀵潙螣閸濆嫬袝婵$偑鍊戦崹娲偡閳哄懎绠栭柍鈺佸暞閸庣喖鏌曢崶褍绨婚柟鍑ゆ嫹
核心提示:对一些需要将数据持久化的小型程序中,传统的关系型数据库显得庞大而不实用,OO数据库有一个学习曲线的问题,而使用xml是一种较好的选择.本文将就设计一个合理的XML持久化的解决方案进行探讨.使用XML作为持久层解决方案的,它的基本功能要有:1.对象的CRUD功能(本例中基本对象是Member类).2.保证线程安全,对桌面

对一些需要将数据持久化的小型程序中,传统的关系型数据库显得庞大而不实用,OO数据库有一个学习曲线的问题,而使用xml是一种较好的选择.本文将就设计一个合理的XML持久化的解决方案进行探讨.

使用XML作为持久层解决方案的,它的基本功能要有:

1.对象的CRUD功能(本例中基本对象是Member类).

2.保证线程安全,对桌面程序和Web程序都一样适用.

3.有缓存,在存储介质即XML文件忽然丢失的情况下还能有效工作.

本例采用了MemberService和MemberPersistence两个类来协作完成这些功能.

MemberService是业务层和持久层之间的桥梁,用于对Member对象的CRUD操作,内置一个hashtable来缓存Member对象,即使文件忽然丢失,缓存中的数据也不会被影响.它内置一个MemberPersistence成员来完成与持久介质的交互.

实现添加,删除,更新的三个函数add(),delete(),update()都用lockObj实现了同步,这样就无需担心线程安全问题.其它函数对members成员没有修改,故不需要实现同步.

try{
memberPersistence.add(member);
members.put(member.getId(), member);
return true;
}
catch(XmlFileWriteException ex){
  System.out.PRintln("Member:" + member.getId() + " add error!");
  return false;
}

当MemberPersistence添加对象成功后,这个对象才会被添加到members中,这样保证了缓存和实际数据的同步;假如颠倒一下顺序,那末MemberPersistence添加对象不成功时,出现XmlFileWriteException异常,这是还需要在catch中删除刚才添加的对象,这样做人为加大了程序的复杂度,不如上面的做法简单高效.

关于查询函数的做法不明白的请见 http://www.blogjava.net/sitinspring/archive/2007/06/05/122119.Html 中形式三.

下面是MemberService类的全部代码:

package com.sitinpsring.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import com.sitinpsring.domain.Member;
import com.sitinpsring.domain.MemberFilter;
import com.sitinpsring.exception.XmlFileReadException;
import com.sitinpsring.exception.XmlFileWriteException;
import com.sitinpsring.persistence.MemberPersistence;
public class MemberService {
private static Hashtable<String, Member> members;
private static MemberPersistence memberPersistence;
private static final Object lockObj = new Object();
static {
try {
memberPersistence = new MemberPersistence("member.xml");
members = memberPersistence.loadMemberFromFile();
} catch (XmlFileReadException ex) {
System.out.println("Can’t read the file:member.xml");
}catch (XmlFileWriteException ex) {
System.out.println("Can’t write to the file:member.xml");
}
}
public MemberService() {
}
public boolean hasMember(String id) {
return members.containsKey(id);
}
public boolean hasMember(Member member) {
return hasMember(member.getId());
}
public boolean add(Member member) {
if (hasMember(member)) {

System.out.println("Member:" + member.getId() + " has been exist!");
return false;
} else {
synchronized (lockObj) {
try{
memberPersistence.add(member);
members.put(member.getId(), member);
return true;
}
catch(XmlFileWriteException ex){
System.out.println("Member:" + member.getId() + " add error!");
return false;
}
}
}
}
public boolean update(Member member) {
if (hasMember(member)) {
synchronized (lockObj) {
try{
memberPersistence.update(member);
Member oldMember = members.get(member.getId());
oldMember.setName(member.getName());
oldMember.setAge(member.getAge());
return true;
}
catch(XmlFileWriteException ex){
System.out.println("Member:" + member.getId() + " upate error!");
return false;
}
}
} else {
System.out.println("Member:" + member.getId()
+ " can’t been found!");
return false;
}
}
public boolean saveOrUpdate(Member member) {
if (hasMember(member)) {
return update(member);
} else {
return add(member);
}
}
public boolean delete(Member member) {
if (hasMember(member)) {
synchronized (lockObj) {
try{
memberPersistence.delete(member.getId());
members.remove(member.getId());
return true;
}catch(XmlFileWriteException ex){
System.out.println("Member:" + member.getId() + " delete error!");
return false;
}
}
} else {
System.out.println("Member:" + member.getId()
+ " can’t been found!");
return false;
}
}
@SuppressWarnings("unchecked")
public List<Member> search(MemberFilter memberFilter) {
ArrayList<Member> retval = new ArrayList<Member>();
for (Iterator it = members.keySet().iterator(); it.hasNext();) {
String key = (String) it.next();
Member member = members.get(key);
if (memberFilter.accept(member)) {
retval.add(member);
}
}
Collections.sort(retval);
return retval;
}
public List<Member> getAll() {
MemberFilter filter = new MemberFilter() {
public boolean accept(Member member) {
return true;
}
};
return search(filter);
}
public Member getMemberById(String id) {
for (Iterator it = members.keySet().iterator(); it.hasNext();) {
String key = (String) it.next();
Member member = members.get(key);
if (member.getId().equals(id)) {
return member;
}
}
return null;
}
}

MemberPersistence类是与XML文件打交道的类,通过它,数据才能真正存入持久介质-XML文件.它的函数都很好理解.这些函数工作时实际只会引发两种异常--读XML文件异常(一般由多个根节点导致)和写XML文件异常,会触发这些异常的函数都应该对他们进行捕捉和抛出处理.

package com.sitinpsring.persistence;
import java.io.File;
import java.io.FileWriter;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import com.sitinpsring.domain.Member;
import com.sitinpsring.exception.XmlFileReadException;
import com.sitinpsring.exception.XmlFileWriteException;
public class MemberPersistence {
private String xmlFilePos;
private Document document;
public MemberPersistence(String xmlFilePos)
throws XmlFileReadException,XmlFileWriteException{
this.xmlFilePos = xmlFilePos;
if (isFileExist(this.xmlFilePos) == false) {
// Create document when file not exist
       createDocument();
return;
} else {
// Get Docunent when file exist
       SAXReader reader = new SAXReader();
try {
document = reader.read(new File(this.xmlFilePos));
} catch (Exception ex) {
throw new XmlFileReadException(ex.getMessage());
}
}
}
private void createDocument() throws XmlFileWriteException{
String text = "<members></members>";
try {
document = DocumentHelper.parseText(text);
writeDocumentToFile();
} catch (XmlFileWriteException ex) {
throw ex;
}catch (Exception ex) {
ex.printStackTrace();
}
}
private void writeDocumentToFile() throws XmlFileWriteException{
try {
XMLWriter writer = new XMLWriter(new FileWriter(this.xmlFilePos));
writer.write(document);
writer.close();
} catch (Exception ex) {
throw new XmlFileWriteException(ex.getMessage());
}
}
public Hashtable<String, Member> loadMemberFromFile() {
Hashtable<String, Member> retval=new Hashtable<String, Member>();
List nodes = document.getRootElement().elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
Member member = new Member(elm.attributeValue("id"),elm.elementText("name"),
Integer.parseInt(elm.elementText("age")));
retval.put(member.getId(), member);
}
return retval;
}
public boolean add(Member member) throws XmlFileWriteException{
try {
Element rootElm = document.getRootElement();
Element newMemberElm = rootElm.addElement("member");
newMemberElm.addAttribute("id", member.getId());
Element nameElm=newMemberElm.addElement("name");
nameElm.setText(member.getName());
Element ageElm=newMemberElm.addElement("age");
ageElm.setText(String.valueOf(member.getAge()));
writeDocumentToFile();
return true;
} catch (XmlFileWriteException ex) {
throw ex;
}
}
public boolean update(Member member) throws XmlFileWriteException{
try {
Element rootElm = document.getRootElement();
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
if(elm.attributeValue("id").equals(member.getId())){
elm.element("name").setText(member.getName());
elm.element("age").setText(String.valueOf(member.getAge()));

break;
}
}
writeDocumentToFile();
return false;
} catch (XmlFileWriteException ex) {
throw ex;
}
}
public boolean delete(String id) throws XmlFileWriteException{
try {
Element rootElm = document.getRootElement();
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
Member member = new Member(elm.attributeValue("id"),elm.elementText("name"),
Integer.parseInt(elm.elementText("age")));
if(member.getId().equals(id)){
rootElm.remove(elm);
break;
}
}
writeDocumentToFile();
return false;
} catch (XmlFileWriteException ex) {
throw ex;
}
}
public static boolean isFileExist(String filePath) {
boolean exists = (new File(filePath)).exists();
return exists;
}
}


Tags:JAVA 使用 XML

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接