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类。这些类的使用将给编码带来较大遍历,关于它们将另行文详述。