基于XML的数据库开发-1

    这几天写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不能有自己的构造函数,只能使用默认构造函数。

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值