论坛首页 综合技术论坛

模仿mongodb采用xml+json实现小型数据库

浏览 1374 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-01-10  

mini-mongodb

   模仿mongodb采用Xml+json实现小型数据库;
    1.实现数据库创建
    2.表的创建
    3.表数据的增、删、改、查

    供大家参考学习使用,有助于更好的了解MongoDB的实现原理!

   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>

代码下载地址: http://zhangdaiscott.github.io/mini-mogodb
论坛首页 综合技术版

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