当柳上原的风吹向天际的时候...

真正的快乐来源于创造

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

 

 

 

 

 

 

Teambiz中从Sql到XML的转化过程

 

 

 

 

 

 

 

作者:何杨

撰写日期:2012年2月23日

版本:1.00

更新日期:2012年2月24日

 

 

第一部分:功能说明

将后台编写的SQL语句,向数据库请求后获得的数据,整理成XML格式的文本。

第二部分:核心组件

名称

路径

说明

JdbcDao

com.ibm.heyang.dao.base.JdbcDao

此类中的fetchRecords函数用来取得数据库中的数据,

NameValueRowMapper

com.ibm.heyang.dao.rowmapper.NameValueRowMapper

此类用于将进行数据库查询得到的行集转化为一个NameValue链表对象。

NameValue

com.ibm.heyang.domain.NameValue

此类用于存储行集中某字段的名称和值,在将对象链表转化为XML的过程中使用了它的函数asXML()。

NameValueList

com.ibm.heyang.domain.NameValueList

内含一个链表,用于容纳NameValue对象链表,在将对象链表转化为XML的过程中使用了它的函数asXML()。

 

第三部分:从SQL语句向XML的转化过程
NameValueRowMapper负责查询结果集一个行的转换,对于其中的每个字段,会形成一个字段名和字段值的NamaValue对象,然后放到一个类型为List<NameValue>的链表中。最终,这个链表对应着这个行集,链表里面的每个元素对应着一个字段(包含其名及值)。

NameValueList用于容纳每个行形成的链表,它本身和查询结果集是对应的。

得到最终的NameValueList之后,调用其asXML方法,将遍历其中的每个元素,得到行集链表,再遍历其中的NameValue对象,再调用每个对象的asXML函数,得到XML文本。

以下展示了两个关键函数:

NameValueList对象的asXML函数如下:

public String asXML() {

            StringBuilder sb=new StringBuilder();    

            for(Object obj:list){

                        List<NameValue> ls=(List<NameValue>)obj;              

                        sb.append("<node>");

                        for(NameValue nv:ls){

                                    sb.append(nv.asXML());

                        }

                        sb.append("</node>");

            }

            return sb.toString();

}

以上粗体部分是每个行的标志,在前台页面对XML进行解析时还要使用到它,这已经形成了前后台之间的一个约定。

NameValue对象的asXML函数如下:

public String asXML() {

            StringBuilder sb=new StringBuilder();

            sb.append("<"+name+">");

            sb.append(StringUtils.isBlank(value)?"-":value);

            sb.append("</"+name+">");       

            return sb.toString();

}

第四部分:效果展示

SQL语句示例:

select text, url, level from teambiz_menu where level<=2 order by level

使用SQL语句从数据库查询出来的结果集:


最终得到的XML文本:

<node>

            <text>登出</text>

            <url>Logout.do</url>

            <level>0</level>

</node>

<node>

            <text>修改自己信息</text>

            <url>Goto.do?page=/page/jsp/user/modify/index.jsp</url>

            <level>1</level>

</node>

<node>

            <text>建立联系</text>

            <url>Goto.do?page=/page/jsp/relation/create/index.jsp</url>

            <level>1</level>

</node>

<node>

            <text>我发出去的联系</text>

            <url>Goto.do?page=/page/jsp/relation/sent/index.jsp</url>

            <level>1</level>

</node>

<node>

            <text>发给我的联系</text>

            <url>Goto.do?page=/page/jsp/relation/received/index.jsp</url>

            <level>1</level>

</node>

<node>

            <text>创建任务</text>

            <url>Goto.do?page=/page/jsp/task/create/index.jsp</url>

            <level>1</level>

</node>

<node>

            <text>我发出去的任务</text>

            <url>Goto.do?page=/page/jsp/task/sent/index.jsp</url>

            <level>1</level>

</node>

<node>

            <text>发给我的任务</text>

            <url>Goto.do?page=/page/jsp/task/received/index.jsp</url>

            <level>1</level>

</node>

<node>

            <text>今日待办任务/已办任务</text>

            <url>Goto.do?page=/page/jsp/task/tododone/index.jsp</url>

            <level>1</level>

</node>

<node>

            <text>用户管理</text>

            <url>#</url>

            <level>2</level>

</node>

 

第五部分:使用步骤

步骤

说明

参照

编写SQL语句

编写一个正确的查询语句,建议使用SqlToolBox进行整形工作。

com.ibm.heyang.dao.MenuDao中的函数getMenuByUserLevel中的SQL语句。

使用fetchRecords函数得到结果集。

这个函数处于com.ibm.heyang.dao.base.JdbcDao类中,无需改动,只需要传入正确的sql语句和RowMapper即可。

com.ibm.heyang.dao.MenuDao中的函数getMenuByUserLevel中的List<?> ls=super.fetchRecords(sql,new NameValueRowMapper());一句。

将结果集用NameValueList包装起来

将结果集传入NameValueList类的构造函数即可。

com.ibm.heyang.dao.MenuDao中的函数getMenuByUserLevel中的return new NameValueList(ls);一句。

将结果集转化为XML

使用NameValueList类的asXML函数。

com.ibm.heyang.service.MenuService的getMenuByUserLevel函数。

 

第六部分:小结

编写SQL语句并将其转化为前台可以辨识的格式是程序员的主要工作负担,采用以上方式的好处有:

1.整个过程中,一个函数fetchRecords和三个对象NameValueRowMapper,NameValue,NameValueList都是系统提供的,程序员无需编码,而只需把SQL语句写好,放到DAO类的一个函数中就可以了。

2.任何查询类的SQL语句,无论字段类型如何,都可以用如上方式处理。

3.如果有特殊的查询方式,com.ibm.heyang.dao.rowmapper下还提供了很多类供使用,如针对select count(*) from tb的IntegerRowMapper类,针对select * from tb where id=XX 的MapRowMapper类,及将将一行记录转化成一个包含键值对的链表的StringRowMapper等,用户也可参照UserRowMapper来书写自己的RowMapper类。这些类的使用将给编码带来较大遍历,关于它们将另行文详述。

posted on 2012-02-29 10:32 何杨 阅读(138) 评论(0)  编辑  收藏 所属分类: Teambiz

只有注册用户登录后才能发表评论。


网站导航: