论坛首页 Java企业应用论坛

用jdom写了一个通用xml的CRUD接口

浏览 5408 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (8) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-04   最后修改:2009-01-08
  最近用jdom弄了个通用的接口,说说作用吧,在程序中你只要提供一个普通的vo类,然后实现我给的那个接口,然后在实现类里就可以实现一整套的CRUD操作,隔离了程序员与xml打交到的部分,讲的有点乱,直接上代码吧
1,比如先建一个User
package vo;
public class User {
	
	private String uid;
	private String username;
	private String age;
	private String sex;
	private String address;
	
        省略getter,setter方法
}

2.然后你要做的写个我提供的通用接口的实现类UserService
package service;

import java.util.List;

import tools.Iservice;
import tools.ServiceCreator;
import vo.User;
//这就是我提供的那个接口
public class UserService implements Iservice<User> {
       
        //在接口实现类里将User的class传进去,然后就能操控基于User的一个XML文件
	private Iservice<User> service;
	public UserService() {
		service = new ServiceCreator<User>(User.class);
	}
	
	public void addObject(User t) {
		
		service.addObject(t);
	}

	public void deleteObject(String ObjectId) {
		service.deleteObject(ObjectId);
	}

	public List<User> getAllObject() {
		return service.getAllObject();
	}

	public User getObject(String ObjectId) {
		return service.getObject(ObjectId);
	}

	public User getObject(String fieldName, String value) {
		return service.getObject(fieldName, value);
	}

}

有了这个类呢,那就随便你怎么写了,程序会自动生成xml文件,看看里面的效果User.xml
<?xml version="1.0" encoding="UTF-8"?>
<Objects>
  <User uid="91865" username="cici" age="12" sex="nan" address="nanchang" />
  <User uid="53307" username="试试" age="35" sex="nv" address="yunnan" />
</Objects>

这样不用数据库,也能非常快速的开发一个小应用,比如留言板之类安全性要求低的应用


下面就把具体内部实现贴出来
首先是接口Iservice.java
package tools;

import java.util.List;

public interface Iservice<T> {

	public abstract void addObject(T t);

	public abstract T getObject(String ObjectId);

	public abstract List<T> getAllObject();

	public abstract void updateObject(String ObjectId, T t);

	public abstract void deleteObject(String ObjectId);
	
	public T getObject(String fieldName,String value);

}

===============================================================================
然后是操控xml的实现类ServiceCreator.java有点长
package tool;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import java.lang.reflect.*;
@SuppressWarnings("unchecked")
public class ServiceCreator <T> implements Iservice<T>{
	
	private static String baseFile="E:/XmlData/model/base.xml";
	private String file="E:/XmlData/model/";
	private Element root;	
	private Document doc;
	private List<Element> Elementlist;
	private T t;
	private List<Method> getMethods;
	private List<Method> setMethods ;
	private List<String> fieldNames;
	private Class<T> classType;

	public ServiceCreator(T t) {
		this.t=t;
		file=new StringBuffer(file).append(t.getClass().getSimpleName()).append(".xml").toString();
		File tempFile=new File(file);
		if(!tempFile.exists()){
			try {
				copyFile(new File(baseFile));
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		doc=new DocCreator().getDoc(file);
		root=doc.getRootElement();
		Elementlist=root.getChildren();
		classType =(Class<T>) t.getClass();
		declearFileds();
	}
	
	//下面是私有共用方法	
	private void declearFileds(){
		Field fields[]=classType.getDeclaredFields();
		getMethods = new ArrayList<Method>();
		setMethods = new ArrayList<Method>();
		fieldNames = new ArrayList<String>();
		for (int i = 0; i < fields.length; i++) {
			Field field = fields[i];
			// 得到属性的名称
			String fieldName = field.getName();
			fieldNames.add(fieldName);
			String firstLetter = fieldName.substring(0, 1).toUpperCase();
			// 得到属性的get和set方法
			String getMethodName = "get" + firstLetter + fieldName.substring(1);
			String setMethodName = "set" + firstLetter + fieldName.substring(1);
			
			try {
				getMethods.add(classType.getMethod(getMethodName,
						new Class[] {}));
				setMethods.add(classType.getMethod(setMethodName,
						new Class[] { field.getType() }));
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
			}
		}		
	}

	private Element searchElement(String objectId){
		for(Element e : Elementlist){
			if(e.getAttribute(fieldNames.get(0)).getValue().equals(objectId)){
				return e;
			}
		}		
		return null;
	}
	
	private Element searchElement(String fieldName,String value){
		for(Element e : Elementlist){
			if(e.getAttribute(fieldName).getValue().equals(value)){
				return e;
			}
		}		
		return null;
	}
	
	@SuppressWarnings("unchecked")
	private T setObjectValue(Element e ){
		
		T newT=null;
		try {
			newT = classType.newInstance();
		} catch (InstantiationException e2) {
			e2.printStackTrace();
		} catch (IllegalAccessException e2) {
			e2.printStackTrace();
		}
		List<Attribute> array= e.getAttributes();
		for(int i=0;i<array.size();i++){
			try {
				setMethods.get(i).invoke(newT, new Object[] { array.get(i).getValue() });
			} catch (IllegalArgumentException e1) {
				e1.printStackTrace();
			} catch (IllegalAccessException e1) {
				e1.printStackTrace();
			} catch (InvocationTargetException e1) {
				e1.printStackTrace();
			}
		}
		
		return newT;
	}	
	
	
	public void copyFile(File fileInput) {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			 fis = new FileInputStream(fileInput);
			 fos = new FileOutputStream(file);
			
			byte[] buff = new byte[1024];
			int byteRead = 0;
			
			while(-1 != (byteRead =fis.read(buff, 0, buff.length))){
				fos.write(buff, 0, byteRead);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
				try {
					fis.close();
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}
	
//===========================添删查改=================	
	public void addObject(T t){
		try {
			if(t!=null){
			 Element newT=new Element(t.getClass().getSimpleName());//新建一个二级结点

			 for(int i=0;i<fieldNames.size();i++){
				 
				 newT.setAttribute(fieldNames.get(i),getMethods
						 .get(i).invoke(t,new Object[] {}).toString());
			 } 
			 root.addContent(newT);
			}
			 XMLOutputter outer=new XMLOutputter(Format.getPrettyFormat());//输出类
			
			 outer.output(doc,new FileOutputStream(file));//输出文档	
		} catch (FileNotFoundException e) {
			System.out.println("文件没有找到!");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}	
	}
	

	public T getObject(String ObjectId){
		
		return setObjectValue(searchElement(ObjectId)); 
	}
	

	public List<T> getAllObject(){
		List<T> list= new ArrayList<T>();
		for(Element e :Elementlist){
			
			list.add(setObjectValue(e));
		}
		return list;
	}

	public void updateObject(String ObjectId,T t){

		root.removeContent(searchElement(ObjectId));
		addObject(t);	
	}

	public void deleteObject(String objectId){
		root.removeContent(searchElement(objectId));
		addObject(null);
	}
	
	public T getObject(String fieldName,String value){
		return setObjectValue(searchElement(fieldName,value));
		 
	}
	
}


================================================================
然后是其中的一个辅助类DocCreator.java

package tools;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class DocCreator {
	
	public Document getDoc(String file){
		 SAXBuilder sb=new SAXBuilder();//实例化SAXBuilder对象
		 Document doc=null;
		try {
			doc = sb.build(new FileInputStream(file));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		 return doc;		
	}

}


因为xml的路径很多时候比较麻烦,所以我就直接硬编码将xml生成在E:/XmlData/model下统一管理
技术上 用了反射来得到vo的所有属性,还有就是泛型来规范接口,当然还有很大的扩展空间,就没太过详细的去弄了
这个可由自己修改地址,假如不想用xml存储了,很简单,写个dao实现Iservice接口就拉倒了
很快的


   发表时间:2009-05-08  
写的很好,楼主在改以个DOM4J的版本吧
0 请登录后投票
   发表时间:2009-05-08  
挺不错的,不用改XML了。直接调用一下就自动生成了。
0 请登录后投票
   发表时间:2009-05-18  
看到JDOM有点害怕了,这东西的版本和中间件的JDOM版本;老是冲突...
0 请登录后投票
   发表时间:2009-05-18  
我记得xstream 好像就是干这个的,楼主的有何新意!!!!
0 请登录后投票
   发表时间:2009-05-25  
如果要求 线程安全?
怎么处理比较好
0 请登录后投票
   发表时间:2009-09-16  
。。。这个jdom比起C#的。。。实在实在是一坨垃圾。
0 请登录后投票
   发表时间:2009-09-16  
jaxb可以
0 请登录后投票
   发表时间:2009-09-20  
拿到一个javabena的set以及get方法。楼主为什么还在拼字符串。精神值得表扬。不过重复了而已。哈哈
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics