采用Xml+json实现小型数据库(仿mongodb)

仿mongodb采用Xml+json实现小型数据库;

    1.实现数据库创建
    2.表的创建
    3.表数据的增、删、改、查
    供大家参考学习使用,有助于更好的了解MongoDB的实现原理!

使用方法:

   1、首先导入该XmlDAO.Jar包
   2、导入Jdom包,提供解析xml文件功能
   3、导入Gson包,提供解析json文件功能
   4、用XmlDAO类里的方法生成一个xml的数据库文件
   5、测试表数据的增、删、改、查功能

代码示例

package org.jeecgframework;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;


import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;


import com.google.gson.Gson;


public class MiniMogodb {
	private static final String _uuid = "_uuid";


	/**
	 * 获取表的全部数据
	 * 
	 * @param path
	 * @param tablename
	 * @return
	 * @throws Exception
	 */
	public List<Map> loadTableDatas(String path, String tablename) throws Exception {
		Gson gson = new Gson();
		FileInputStream file = new FileInputStream(path);
		SAXBuilder saxBuilder = new SAXBuilder();
		Document document = saxBuilder.build(file);
		Element root = document.getRootElement();


		List<Map> l = new ArrayList();
		List<Element> list = root.getChildren();
		for (Element x : list) {
			if (x.getAttributeValue("name").equals(tablename)) {
				List<Element> al = x.getChildren();
				for (Element s : al) {
					String data = s.getText();
					if (data == null) {
						break;
					}
					Map mp = gson.fromJson(data, Map.class);
					l.add(mp);
				}
			}
		}
		return l;
	}


	/**
	 * 表插入数据
	 * 
	 * @param path
	 * @param tablename
	 * @param po
	 * @return
	 * @throws JDOMException
	 * @throws IOException
	 */
	public boolean addData(String path, String tablename, Object po)
			throws JDOMException, IOException {
		Gson gson = new Gson();
		boolean flag = false;
		FileInputStream file = new FileInputStream(path);
		SAXBuilder saxBuilder = new SAXBuilder();
		Document document = saxBuilder.build(file);
		Element root = document.getRootElement();


		List<Element> list = root.getChildren();
		for (Element x : list) {
			if (x.getAttributeValue("name").equals(tablename)) {
				Map base = new HashMap();
				base.put(_uuid, UUID.randomUUID().toString());
				Element data = new Element("data");
				String json = gson.toJson(po);
				Map mp = gson.fromJson(json, Map.class);
				base.putAll(mp);
				data.addContent(gson.toJson(base));
				x.addContent(data);
			}
		}
		XMLOutputter out = new XMLOutputter();
		out.output(document, new FileOutputStream(path));
		flag = true;
		System.out
				.println("----------insert --- data --- success----------------------");
		return flag;
	}


	/**
	 * 表修改数据
	 * 
	 * @param path
	 * @param tablename
	 * @param po
	 * @throws JDOMException
	 * @throws IOException
	 */
	public void updateData(String path, String tablename, Object po)
			throws JDOMException, IOException {
		FileInputStream file = new FileInputStream(path);
		SAXBuilder saxBuilder = new SAXBuilder();
		Document document = saxBuilder.build(file);
		Element root = document.getRootElement();
		Gson gson = new Gson();


		List<Element> list = root.getChildren();
		for (Element x : list) {
			if (x.getAttributeValue("name").equals(tablename)) {
				List<Element> al = x.getChildren();
				for (Element s : al) {
					// 如果定位Data[通过UUID唯一标示]
					Map mp = gson.fromJson(s.getText(), Map.class);
					Map newmp = gson.fromJson(gson.toJson(po), Map.class);
					if (mp.get(_uuid).equals(newmp.get(_uuid))) {
						mp.putAll(newmp);
						Element data = new Element("data");
						data.setText(gson.toJson(mp));
						x.removeContent(s);
						x.addContent(data);
						break;
					}
				}
			}
		}
		XMLOutputter out = new XMLOutputter();
		out.output(document, new FileOutputStream(path));
		System.out
		.println("----------update --- data --- success----------------------");
	}


	/**
	 * 表删除数据
	 * 
	 * @param path
	 * @param tablename
	 * @param po
	 * @throws JDOMException
	 * @throws IOException
	 */
	public void deleteData(String path, String tablename, Object po)
			throws JDOMException, IOException {
		FileInputStream file = new FileInputStream(path);
		Gson gson = new Gson();
		SAXBuilder saxBuilder = new SAXBuilder();
		Document document = saxBuilder.build(file);
		Element root = document.getRootElement();
		List<Element> list = root.getChildren();
		for (Element x : list) {
			List<Element> al = x.getChildren();
			if (x.getAttributeValue("name").equals(tablename)) {
				for (Element s : al) {
					// 如果定位Data[通过UUID唯一标示]
					Map mp = gson.fromJson(s.getText(), Map.class);
					Map newmp = gson.fromJson(gson.toJson(po), Map.class);
					if (mp.get(_uuid).equals(newmp.get(_uuid))) {
						x.removeContent(s);
						break;
					}
				}
			}
		}
		XMLOutputter out = new XMLOutputter();
		out.output(document, new FileOutputStream(path));
		System.out
		.println("----------delete --- data --- success----------------------");
	}


	/**
	 * 创建数据库
	 * 
	 * @param path
	 * @throws Exception
	 */
	public void createDataBase(String path) throws Exception {
		FileOutputStream file1 = new FileOutputStream(path);
		Document document = new Document();
		Element root = new Element("database");
		Element sort1 = new Element("table");
		sort1.setAttribute("name", "test");
		Element sort2 = new Element("table");
		sort2.setAttribute("name", "system.indexs");
		Element sort3 = new Element("table");
		sort3.setAttribute("name", "system.users");


		root.addContent(sort1);
		root.addContent(sort2);
		root.addContent(sort3);


		document.setRootElement(root);
		XMLOutputter out = new XMLOutputter();
		out.output(document, file1);
		System.out
				.println("----------create---database---success-------------------");
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<database>
	<table name="test">
		<data>{"sex":"男","age":20.0,"name":"lisan","money":2000.98,"_uuid":"a2b64d1a-63ea-4a1b-b1e3-67adcc687c0a"}
		</data>
	</table>
	<table name="system.indexs" />
	<table name="system.users" />
</database>

 

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 采用Xml+json实现小型数据库(仿mongodb)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址