成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java使用XML作為持久存儲(chǔ)介質(zhì)實(shí)現(xiàn)方法

開(kāi)發(fā)
對(duì)一些需要將數(shù)據(jù)持久化的小型程序中,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)顯得龐大而不實(shí)用,OO數(shù)據(jù)庫(kù)有一個(gè)學(xué)習(xí)曲線的問(wèn)題,而使用XML是一種較好的選擇.本文將就設(shè)計(jì)一個(gè)合理的XML持久化的解決方案進(jìn)行探討.

使用XML作為持久層解決方案的,它的基本功能要有:

1.對(duì)象的CRUD功能(本例中基本對(duì)象是Member類).

2.保證線程安全,對(duì)桌面程序和Web程序都一樣適用.

3.有緩存,在存儲(chǔ)介質(zhì)即XML文件突然丟失的情況下還能有效工作.

本例采用了MemberService和MemberPersistence兩個(gè)類來(lái)協(xié)作完成這些功能.

MemberService是業(yè)務(wù)層和持久層之間的橋梁,用于對(duì)Member對(duì)象的CRUD操作,內(nèi)置一個(gè)hashtable來(lái)緩存Member對(duì)象,即使文件突然丟失,緩存中的數(shù)據(jù)也不會(huì)被影響.它內(nèi)置一個(gè)MemberPersistence成員來(lái)完成與持久介質(zhì)的交互.

實(shí)現(xiàn)添加,刪除,更新的三個(gè)函數(shù)add(),delete(),update()都用lockObj實(shí)現(xiàn)了同步,這樣就無(wú)需擔(dān)心線程安全問(wèn)題.其它函數(shù)對(duì)members成員沒(méi)有修改,故不需要實(shí)現(xiàn)同步.

try{ 

memberPersistence.add(member);

members.put(member.getId(), member);

return true;

}

catch(XmlFileWriteException ex){

   System.out.println("Member:" + member.getId() + " add error!");

   return false;

}

當(dāng)MemberPersistence添加對(duì)象成功后,這個(gè)對(duì)象才會(huì)被添加到members中,這樣保證了緩存和實(shí)際數(shù)據(jù)的同步;如果顛倒一下順序,那末MemberPersistence添加對(duì)象不成功時(shí),出現(xiàn)XmlFileWriteException異常,這是還需要在catch中刪除剛才添加的對(duì)象,這樣做人為加大了程序的復(fù)雜度,不如上面的做法簡(jiǎn)單高效.

關(guān)于查詢函數(shù)的做法不明白的請(qǐng)見(jiàn) http://www.blogjava.net/sitinspring/archive/2007/06/05/122119.html 中形式三.

下面是MemberService類的全部代碼:

package com.

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 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 search(MemberFilter memberFilter) {

ArrayList retval = new ArrayList();

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 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文件打交道的類,通過(guò)它,數(shù)據(jù)才能真正存入持久介質(zhì)-XML文件.它的函數(shù)都很好理解.這些函數(shù)工作時(shí)實(shí)際只會(huì)引發(fā)兩種異常--讀XML文件異常(一般由多個(gè)根節(jié)點(diǎn)導(dǎo)致)和寫XML文件異常,會(huì)觸發(fā)這些異常的函數(shù)都應(yīng)該對(duì)他們進(jìn)行捕獲和拋出處理.

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 = "";

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 loadMemberFromFile() {

Hashtable retval=new Hashtable();

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;

}

}

【編輯推薦】

  1. PHP中使用XML-RPC構(gòu)造Web Service簡(jiǎn)單入門
  2. 詳解Java解析XML的四種方法
  3. XML新手入門 創(chuàng)建構(gòu)造良好的XML
責(zé)任編輯:彭凡 來(lái)源: 51CTO
相關(guān)推薦

2017-11-21 14:32:05

容器持久存儲(chǔ)

2021-06-18 16:30:52

戴爾

2020-03-25 11:37:17

存儲(chǔ)云原生DevOps

2013-05-03 11:01:22

iOS開(kāi)發(fā)歸檔永久存儲(chǔ)數(shù)據(jù)

2023-08-29 07:34:43

Mimir微服務(wù)

2018-06-21 15:14:51

Kubernetes存儲(chǔ)容器

2018-07-19 10:56:16

Kubernetes存儲(chǔ)架構(gòu)

2021-01-26 14:11:19

加密貨幣數(shù)字貨幣比特幣

2018-04-08 09:01:08

全閃存陣列AFA

2022-08-22 07:58:14

容器云存儲(chǔ)開(kāi)發(fā)

2010-07-22 15:33:36

BlackBerry開(kāi)

2009-07-17 14:51:22

.Net Micro

2017-12-06 09:00:14

2009-05-04 10:25:36

XML.NET數(shù)據(jù)

2010-10-28 10:10:48

oracle存圖片

2017-10-19 16:21:02

SCM存儲(chǔ)技術(shù)

2023-11-26 09:06:46

2019-12-27 13:50:04

JavaAPI代碼

2010-10-29 16:12:51

Oracle存儲(chǔ)過(guò)程

2021-12-15 12:00:17

Pythonpickle存儲(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产一区二区三区在线看 | 看亚洲a级一级毛片 | 国产视频中文字幕 | aaa级片| 国产精品国产精品国产专区不片 | 国产精品一区二区电影 | 久久草在线视频 | 一级片免费视频 | 亚洲综合色视频在线观看 | 日本人爽p大片免费看 | 久久免费精品 | 自拍偷拍中文字幕 | 久久精品网 | a在线视频| 日本久久精 | aaa级片 | 激情一区 | 免费黄色av | 久久精品中文字幕 | 国产精品有限公司 | 国产日产精品一区二区三区四区 | 欧美日韩大片 | 久草视频网站 | 成人毛片一区二区三区 | 日韩免费一二三区 | 青青草综合| 亚洲午夜精品 | 国产日韩欧美一区二区 | 日韩精品一区二区在线 | 久久免费看 | 日本中文字幕日韩精品免费 | 日韩一区二区三区在线观看视频 | 欧美国产日韩在线观看 | 国产在视频一区二区三区吞精 | 偷拍自拍网站 | 久久久999成人 | 日韩成人免费视频 | 久久精品16 | 精品国产成人 | 人人干人人干人人干 | 日韩欧美国产综合 |