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

2016-02-19 20:03 8 1 收藏

下面是个JAVA使用XML作为持久存储介质实现方法教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

【 tulaoshi.com - 编程语言 】

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

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  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类的全部代码:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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 HashtableString, 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 ListMember search(MemberFilter memberFilter) {
  ArrayListMember retval = new ArrayListMember();
  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 ListMember 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 HashtableString, Member loadMemberFromFile() {
  HashtableString, Member retval=new HashtableString, 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;
  }
  }


来源:https://www.tulaoshi.com/n/20160219/1622611.html

延伸阅读
标签: ASP
  在  网上 讨论 如何 实现 分页  有很多程序,我在这里向大家  介绍一种实现分页的新的方法,使用 存储过程 来实现分页    由于 这段程序写的 比较早,那个时候 还没有 SQL 7,每一个 Varchar 只能 支持 255 个字符,所以 采取了一种比较笨的办法,如果大家有兴趣,请去  http:/...
众所周知,Java语言最明显的优势在于用它设计的程序可以广泛地运行于互联网上所有安装了VM解释器的计算机上。然而,如今JAVA之所以在市场上如此流行,还得益于它的另一卖点:它提供了安全可靠和使用方便的存储治理机制。这是部分编程人员将它与其前身C++语言对比后所得出的结论。本文将针对两种语言的内存(以对象为单位)使用机制,...
首先得到:得到 DOM 解析器的工厂实例      DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance(); 然后从 DOM 工厂获得 DOM 解析器  DocumentBuilder dombuilder=domfac.newDocumentBuilder(); )把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它 InputStream is= new  F...
数据报(Datagram)使网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的、独立的、自身包含地址信息的消息,它能否到达目的地,到达的时间,到达时内容是否会变化不能准确知道的。!-- frame contents -- !-- /frame contents --它的通讯双方是不需要建立连接的,对于一些不需要很高质量的应用程序来说,数据报...
标签: Web开发
基于web的技术中,分页是一个老的不能再老的,但大家津津乐道的问题,随着xml技术的日渐应用,把xml应用到分页当中,也是一种可能,当然网上的教程很多,当我都是看得稀里糊涂,索性自己写一个,与大家分享、指正。 共有两个文件tmh.htm & tt.xml 源代码如下: tmh.htm ___________________________________________________ !DOCTYPE ...

经验教程

358

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部