这几天写swing应用的时候,常常发现实际上只是为了存储和管理一些简单的数据。
如果使用读写文件操作,感觉是不是很专业~~~,如果使用数据库,比如sql等,又感觉杀鸡用牛刀了。有没有一种适合小应用使用的本地数据库否???
偶木有找到,所以只能自己写一个用用。。。。。
基本思路如下:
----------------------------------------------
1.数据库与java类绑定,比如你想创建一个叫student的数据表,数据包括名字,年龄,学号。那你只需要创建一个student的类,使用
数据库接口,即可创建出数据表
2,能够解析SQL文。
3.插入,更新数据也只需要根据传入的class,更新数据库即可。
4.搜索数据库的结果,返回的是用ArrayList保存的一个动态数组。
5.为了减少IO操作,数据库所有内容基本都存于内存中,相当于一个内存数据库,但是会定时将内容存入XML文件中。
-------------------------------------------------
由于俺是开发java swing的,所以整个数据库也准备用java来实现。
1.数据库与java类绑定的实现
这个其实还是比较简单的,主要需要用到的是java的反射机制。具体代码如下:
---------------------------------------------------------------------------------------------------------
for (int j = 0; j < elementList.getLength(); j++) {
Object membet = constructor.newInstance();
Field[] fieldlist = membet.getClass().getDeclaredFields();
Element node = (Element) elementList.item(j);
if (!node.getNodeName().equals(ELEMENT_TAG_DATA)) {
continue;
}
NodeList dataNodeList = node.getChildNodes();
for (int k = 0; k < dataNodeList.getLength(); k++) {
Element dataNode = (Element) dataNodeList.item(k);
for (Field field : fieldlist) {
if (dataNode.getNodeName().equals(field.getName())) {
field.setAccessible(true);
switch (PraseParamUtil.PraseObjectType(dataNode
.getAttribute(ELEMENT_TAG_ATTR))) {
case PraseParamUtil.PRASE_TYPE_INT:
int intValue = Integer.valueOf(dataNode
.getTextContent());
field.setInt(membet, intValue);
break;
case PraseParamUtil.PRASE_TYPE_BOOLEAN:
Boolean boolValue = Boolean.valueOf(dataNode
.getTextContent());
field.setBoolean(membet, boolValue);
break;
case PraseParamUtil.PRASE_TYPE_FLOAT:
float floatValue = Float.valueOf(dataNode
.getTextContent());
field.setFloat(membet, floatValue);
break;
case PraseParamUtil.PRASE_TYPE_LONG:
Long longValue = Long.valueOf(dataNode
.getTextContent());
field.setLong(membet, longValue);
break;
case PraseParamUtil.PRASE_TYPE_STRING:
String stringValue = String.valueOf(dataNode
.getTextContent());
field.set(membet, stringValue);
break;
}
}
}
}
list.add(membet);
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
---------------------------------------------------------------------------------------------------------
使用java的反射机制可解析出用户传入的obj的成员变量。
但是有一个比较纠结:
如果用户定义的class中有多个构造函数的情况下,由于数据库无法知道具体构造函数参数
的意义,无法使用带参的构造函数。。。。。所以这里做了一个约定,用于对应数据表的
class不能有自己的构造函数,只能使用默认构造函数。