快速业务通道

将XML结点转换成JAVABEAN并存入数据库 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25
性Y是原子字段,则要求属性Y必须为String类型,否则程序不知道将值Z转换成哪种类型(注:关于PropertyUtils, 请见apache commons Beanutils )

b.入库时发现x.getY()=z。如果属性y是原子字段,则执行SQL insert into X(...,y,...) values (...,z,...),这里要求y字段必须为varchar/char类型, 以免发生类型转换错误.

关于问题b

XML树:JDOM, dom4j等都可以直接找到父子关系

BEAN体系:

I.原子属性。我们限定一个BEAN中所有有业务意义的原子字段的类型都STRING,所有String类型的字段都是业务字段

II.单个子结点。我们让所有有业务意义的非原子字段都实现一个共同的接口BusiNode,这样一个BEAN中所有BusiNode成员都是这个BEAN的子结点

III.类集子结点。我们也可以限定所有且只有类集子结点可以使用List或Set类型,这样可以利用过滤出所有类集子结点。然而,在JAVA1.4及以前的版本里,程序并不知道过滤出的类集子结点是哪个Class的实例(因为没有泛型),也就没办法实例化一个类集子结点(见后文),因此只能手动注册类集子结点的属性名和Class。JAVA1.5以上的版本我没用过,不知道可不可以解决这个问题。

数据库表关系: 这就不用多说了,就是通过外键参考。因此每类结点对应的表中,都必须有个外键,以参考它的父结点;还必须有个主键,以供它的子结点参考。各表的外键名必须相同并为一常数,否则程序生成INSERT SQL时才可以不用理会具体表的具体的外键名。

程序在解析时,遍历的是BEAN树;在持久化时也是。比起XML树,BEAN树代表真正的业务结构;比起数据库表关系树,BEAN树才能由父至子地进行先序遍历

4.其他问题

a.要让程序知道,原子属性中哪些是XML结点的属性,哪些是XML结点的原子ELEMENT。代码中这是两个抽象方法,必须让具体的结点类实现

b.回顾本文概述部分提到的“pig --content --pighead 的三级关系,无端端多了一个content结点”,因此我们要让程序知道,pighead,pigfoot等结点的子结点,究竟是pig,还是pig下的content。处理不规范XML时要注意这个问题。这也是一个抽象方法,必须让具体的结点类实现

c.与上一条类似但更变态的,是类集结点的不规范问题。假设一个pig有多个pighead,那结构可能为 pig--pighead,pighead,...,也可能为pig--pigheads--content,content.... 必须让程序知道某个具体结点用的是哪种模式

5.代码

核心:多态 + 递归

a.接口BusiNode

import java.util.*;import org.dom4j.Element;/*** 每个结点都要实现的接口* 它提供了一些方法以方便实现递归的XML解析和持久化**/public interface BusiNode {    /**   * 所有类型为不可分类型的属性   * @return 属性名的集合   */  public List getAtomicPropNames();    /**   * 一些成员变量。这些成员变量是XML结点的属性   * @return   */  public List getXmlAttributes();    /**   * 一些成员变量。这些成员变量是XML结点的子元素,并且类型为不可分的   * @return   */  public List getXmlAtomicElements();      /**   * 所有类型为类集的属性,并且这些类集中每个元素的类型都是BusiNode   * @return key = 属性名, value = 属性类的Class对象。   * 如果为空不返回NULL,而是空的MAP   */  public Map getCollectionPropsMap();    /**   * 所有类型为BusiNode的属性   * @return 属性名的集合   */  public List getBusiNodePropNames();      /**   * 从XML中解析出来。   * @param element   * @return   */  public void parseFromXML(Element element);    }

b.默认的实现

import java.lang.reflect.Field;import java.util.*;im

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号