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

最近用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接口就拉倒了
很快的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值