众所周知,JAVA有一个强大的功能——串行化,任何一个类只要实现了Serializable接口(这个接口只是一个空接口),那么这个类的实例对象就能被保存起来而且还可以输出到磁盘上个一个文件,同时也可以从流中恢复成保存前的对象状态。关于串行化最重要的一点是,当对象被串行化时,引用到的所有其他对象也将被一起串行化,因此串行化操作可获得完整的对象连接图形。当然前提是所有的对象必须实现Serializable接口。
利用这个特性,我们可以实现自己的简易“对象数据库”,更确切的说是“对象文件”。基于这个思想,本人已经实现了最最基本的几个操作,比如,建立数据库、建立数据表、表的查询,更新,插入,删除以及简易的事务处理。其中,事务处理使用了缓存表技术。现将简单的文件组织结构图展示如下:
说明:主系统表主要用于存储所有用户创建的数据库信息,比如:当前所有的数据库名称等。主系统表由单独一个文件组成(systemTable.ser),文件中保存着一个SystemTable对象,该对象是由一个TreeMap对象组成,另外还提供了一些常用的集合操作方法。TreeMap对象中的Key是数据库的名称,value是一个MetaData对象,MetaData对象用于保存一些元数据信息。如表名,关键字,存储的对象的类型等。
说明:用户库是用户自己创建的数据库,由一个TreeMap对象维护,TreeMap的Key是数据表的名称,Value是SystemTable对象和ArrayList对象,SystemTable对象保存着当前用户库中所有数据表的元数据信息,比如表名称以及每个ArrayList对象中元素的类型等。ArrayList对象则存储着具体的每一个对象(ArrayList中的每个元素的类型必须一致),相当于关系型数据库中的一张表,而ArrayList对象中的每个元素,则相当于关系型数据库中的每条记录。
以下是接口文件:DatabaseOperationImp.java
public interface DatabaseOperationImp {
/**
* 建立数据库文件,需要使用同步处理
* @param databaseName 欲创建的数据库名称
* @throws ReadDbException
* @throws SystemTableException
*/
public void createDatabase(String databaseName) throws IODbException,SystemTableException;
/**
* 建立数据表,需要使用同步处理
* @param tableName 欲创建的数据表名称
* @param className 在表中存储的对象的类型,比如Person.class等
* @throws ReadDbException
* @throws SystemTableException
*/
public void createTable(String tableName,Class className) throws IODbException,SystemTableException;
/**
* 在指定的表中插入一个对象,需要使用同步处理
* @param item 要存储的对象
* @throws IODbException
*/
public void insert(Object item) throws IODbException,SystemTableException;
/**
* 读取指定表中的第一个对象
* @return Object
* @throws IODbException
*/
public Object readFirst() throws IODbException;
/**
* 读取指定表中的最后一个对象
* @return Object
* @throws IODbException
*/
public Object readLast() throws IODbException;
/**
* 读取指定表中的所有对象
* @return List
* @throws IODbException
*/
public List readAll() throws IODbException;
/**
* 读取指定表中从start开始的所有对象
* @param start 起始索引
* @return List
* @throws IODbException
* @throws IndexOutOfBoundsException
*/
public List readPart(int start) throws IODbException,IndexOutOfBoundsException;
/**
* 读取指定表中的从start开始到end结束的所有对象(重载方法)
* @param start 起始索引
* @param end 结束索引
* @return List
* @throws IODbException
* @throws IndexOutOfBoundsException
*/
public List readPart(int start,int end) throws IODbException,IndexOutOfBoundsException;
/**
* 根据查询条件读取指定表中符合条件的记录
* @param condition 保存查询条件的Criterion对象
* @return List
* @throws IODbException
* @throws SystemTableException
*/
public List read(Criterion condition) throws IODbException;
/**
* 更新表中的记录,需要使用同步处理
* @param condition 保存更新条件的Criterion对象
* @param fieldValue 保存要更新的内容的FieldValueBean对象
* @return int 受影响的记录数
* @throws IODbException
*/
public int update(Criterion condition,FieldValueBean fieldValue) throws IODbException;
/**
* 删除表中的记录,需要使用同步处理
* @param condition 保存删除条件的Criterion对象
* @return int 受影响的记录数
* @throws IODbException
*/
public int delete(Criterion condition) throws IODbException;
/**
* 删除表中的所有记录(重载方法),需要使用同步处理
* @return int 受影响的记录数
* @throws IODbException
*/
public int delete() throws IODbException;
/**
* 开始一个事务处理
*/
public void beginTrans();
/**
* 提交一个事务
*/
public void commit();
/**
* 回滚一个事务
*/
public void rollback();
}
另外,需要注意的是,在读取或保存对象的时候,由于事先不知道用户需要读取或保存的对象的类型,所以必须要用户在建立表的时候提供对象的Class对象。然后就可以利用JAVA的反射机制来自动调用对象的setter和getter方法,这样就可以设置或读取JavaBean对象中的属性值了。
由于本人的能力有限,所以目前编写的这个东东非常的粗糙,还需要很长时间的完善和扩展,JAVA的套接字接口和简单的串行化对象协议,更可以让我们创建自己的“网络对象数据库”。
本文地址:http://com.8s8s.com/it/it15019.htm