动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > 数据库技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ 数据库技巧 ]的信息



本月文章推荐
.轻松掌握SQL Server中各个系统表.
.使用T-SQL强制所有用户退出当前数.
.使用Transact-SQL计算SQL Server.
.教你在SQL Server数据库中拆分字.
.快速解决SQL server 2005孤立用户.
.探讨SQL Server存储过程.
.sql server存储过程、存储函数的.
.SQL Server导出表到EXCEL文件的存.
.更改数据库表中现有行内的任何或.
.查询表主键外键信息的SQL.
.轻松掌握密码有效性验证失败的处.
.导致checkpoint进程耗用大量CPU的.
.讲解数据库加密技术的功能特性与.
.SQL Server 索引结构及其使用(一.
.存储过程与SQL语句的恩怨情仇.
.讲解数据库中行级转换成列级的实.
.SQL Server2008数据库引擎功能的.
.sql年月日计算方法.
.解决SQL速度慢的方法.
.在SQL Server 2005中用存储过程实.

使用XML封装数据库操作语句的实现

发表日期:2005-7-3 |


在项目开发的过程当中,项目组开发成员的编程风格差异和数据库操作语句SQL的灵活性给项目组带来了越来越多的操作和维护难度。
比如:从user表中取出所有数据,有的人会写成“select * from user”,有的人会写成“select all from user”,虽然在操作中不会有任何的错误,但在其他人读程序的过程时就会产生不好的感觉。
如果这种程序差异在项目中的数量级很多,那么在开发的过程当中程序就会出现各种各样的风格,在维护的过程中就会拼命的挠头并诅咒那些当初写程序的人。

为了整篇文章的举例,现在我们在数据库中建立如下表
TBL_USER
USERID BIGINT
USERNAME VARCHAR(20)
PASSWORD VARCHAR(20)
CREATETIME DATE

TBL_USER_INFO
USERID BIGINT
EMAIL VARCHAR(64)
MOBILE VARCHAR(13)

一、分析

A、分析select语句

于是使用XML来封装数据库操作语句成为项目规范化操作的第一步骤。在这个步骤中,我们将举几个例子来逐步实现封装的目的。
比如 “ SELECT USERNAME, PASSWORD FROM TBL_USER ” 这个语句,分析成XML文件时可以有各种各样的写法,我们现在使用如下的表达方式:
分析(1)
1 <dbtrans name=“selectUser” table=“TBL_USER” method=“select”>
2 <get>
3 <property name=“username” type=“string”/>
4 <property name=“password” type=“string”/>
5 </get>
6 </dbtrans>
在第一行的句子中使用 dbtrans 为节点名称,
属性name为这个交易的名称,这里为“selectUser”,
属性table为索取表的名称,这里为“TBL_USER”,
属性method为操作数据库的方法,这里为“select”,
子节点<get></get>意思为从数据库读取数据。
子节点<property />为读取的数据库字段,其中:
属性name为字段的名字,
属性type 为字段的类型,这里设置类型在后面的程序中可以体现出来。

对于“SELECT USERNAME, PASSWORD FROM TBL_USER WHERE USERID=123”语句,我们根据上述的分析,则可将XML描绘为:
分析(2)
1. <dbtrans name=“selectUserByKey” table=“TBL_USER” method=“select”>
2. <key>
3 <property name=“userid” type=“long”/>
4 </key>
5 <get>
6 <property name=“username” type=“string”/>
7 <property name=“password” type=“string”/>
8 </get>
9 </dbtrans>
如果使用的是like操作,我们可以将第3句描述成为<property name=“username” type=“string” match=“like”/>

对于“SELECT USERNAME, PASSWORD FROM TBL_USER ORDER BY USERNAME DESC”这个语句,XML如下分析:
分析(3)
1. <dbtrans name=”selectUser” table=”TBL_USER” method=”select”>
2 <get>
3 <property name=”username” type=”string”/>
4 <property name=”password” type=”string”/>
5 </get>
6 <order name="respcode" match="desc" />
7 </dbtrans>
这样的语句分析基本上可以完成了绝大部分的普通数据库的select语句的操作,但是毕竟还是会有一些我们无法预料的数据库操作语句会出现,比如
“SELECT USERNAME, PASSWORD FROM TBL_USER WHERE CREATETIME >‘2003-7-16’ AND CREATETIME<‘2003-9-16’”时,同时出现了CREATETIME在 <key>之中,这时我们可以将XML描绘成为:
<key>
<property name=“starttime” column=“createtime” type=“date” match=“>”>
<property name=“endtime” column=“createtime” type=“date” match=“<”>
</key>

但即使使用了以上的变通方法,还是会有很多的特殊语句是无法完成的,比如 “ SELECT COUNT(*) FROM TBL_USER ”, 这时的操作会出现使用XML语句无法描绘的时候,这个时候我们就可以引入了special这个属性,例如:
分析(4)
1  <dbtrans name=”selectUser” table=”TBL_USER” method=”select” special=”select count(*) from tbl_user”>
2  </dbtrans>
这个属性的意思是将所有的特殊交易都特殊表现出来。

B、分析INSERT语句

INSERT 语句在关系型数据库中操作可以说是最麻烦的一条语句了,因为如果你需要在TBL_USER和TBL_USER_INFO表中建立一条对应的数据时,你需要知道插入数据库的主键的值,在JDBC3.0中可以使用Statement.RETURN_GENERATED_KEYS来获取,但是如果为了兼容性考虑,我们在操作过程之中决定采用另一种办法来实现。
我们在数据库中建立一个表,名为:TSYS_PRIMARYKEY,其中包括三个字段,如下:
TSYS_PRIMARYKEY
KEYID BIGINT
TABLENAME VARCHAR(64)
PRIMARYKEY VARCHAR(30)
其中TABLENAME保存表名,PRIMARYKEY保存主键的名称,KEYID保存主键的值,这样的做法目的是在insert语句操作前,先取到现在主键的值,并将该值加1,成为现有的主键,然后进行insert操作,操作完成之后我们还需要update一下TSYS_PRIMARYKEY这个表,确保数据的同步。
现在我们开始分析 INSERT语句了,
INSERT INTO TBL_USER ( USERID, USERNAME, PASSWORD ) VALUES ( 100, ‘test’, ‘test’ )
INSERT INTO TBL_USER_INFO ( USERID, EMAIL, MOBILE ) VALUES ( 100, ‘test@test.com’, ‘1234567890’ )

描绘为XML文件时我们可以描绘如下
分析5)
1. <dbtrans name=“insertUser” table=“TBL_USER” method=“insert”>
2 <primarykey name=“userid” >
3 <set>
4 <property name=“username” type=“string”/>
5 <property name=“password” type=“string”/>
6 </set>
7 </dbtrans>
以及
1 <dbtrans name=“insertUserInfo” table=“TBL_USER_INFO” method=“insert”>
2 <set>
3 <property name=“userid” type=“long”/>
4 <property name=“email” type=“string”/>
5 <property name=“mobile” type=“string”/>
6 </set>
7 </dbtrans>

C、分析DELETE语句

Delete语句最常用的可以分为两种,一种是按照键值删除,一种是全部删除,为此我们将此操作划分为两种类型,delete和clear
对于delete类型,举例为:
DELETE FROM TBL_USER_INFO WHERE USERID=123
描述为:
分析(6)
1 <dbtrans name=“deleteUserInfo” table=“TBL_USER_INFO” method=“delete”>
2 <key>
3 <property name=“userid” type=“long” />
4 </key>
5 </dbtrans>

对于clear类型,举例为:
DELETE FROM TBL_USER_INFO
描述为:
分析(7)
1 <dbtrans name=“clearUserInfo” table=“TBL_USER_INFO” method=“clear”>
2 </dbtrans>

D、分析UPDATE语句

从update通常的操作我们可以知道使用XML描述时将会出现两种tag,包括<key>和<set>,比如:
UPDATE TBL_USER_INFO SET EMAIL=’aaa@aaa.com’ WHERE USERID=123
描述称XML为:
分析8)
1. <dbtrans name=“updateUserInfo” table=“TBL_USER_INFO” method=“update”>
2 <key>
3 <property name=“userid” type=“long” />
4 </key>
5 <set>
6 <property name=“email” type=“string” />
7 </set>
8 </dbtrans>

 

二、程序设计

好的,在分析了XML文件之后需要我们进入到程序的设计上来了。从以上实现的分析我们可以清楚的看到要实现以上操作,我们必须要做到以下几步:
1   读取XML文件
2   定位相应的交易节点
3   拼SQL 语句
4   数据库操作
5   取数据
6   返回数据

其中针对第一步的读取文件,我们可以封装所有的XML parse语句以及前期的操作封装进入一个类之中,这里我们命名为 XMLLoadFile。

交易处理的过程包括2,5,6三个步骤,可以封装成XMLTransaction类中。当然返回数据这个操作可以单独抽出来作为一个相应的返回类,如果这样是为了在返回的数据报文做处理,比如可以返回XML,Vector或者Hashtable或Map等。这里暂定返回数据为Vector类型,所以将第6步封装进来。

拼装SQL语句,独立建立一个类(XMLCombine),当然也可以分为多个,比如SelectCombine,insertCombine等,这里我们进行统一封装。

数据库操作单独封装成一个类,XMLExecuteSQL。

以上所有的类统一了一个出口类,这里为XMLUtils。这个类提供的几个方法为外部数据操作的主要方法,比如select, insert, delete, update等,还有提供外部程序存取数据的几个方法,比如:setTransNode(设置交易节点),setTransValue(设置交易数据值), setTransKeyValue(设置交易键值数据值)

 

三、外部程序调用

对于select语句,分析(1)所需编写的程序如下
XMLUtils util = new XMLUtils();
util.setTransNode(“selectUser”);
Vector vRtn = util.select( con );

分析(2)为
XMLUtils util = new XMLUtils();
util.setTransNode(“selectUserByKey”);
util.setTransKeyValue(“userid”, 123 );
Vector vRtn = util.select( con );

对于insert语句,分析(5)程序如下
XMLUtils util = new XMLUtils();
util.setTransNode(“insertUser”);
util.setTransValue(“username”, “test” );
util.setTransValue(“password”, “test” );
Vector vRtn = util.insert( con ); //假设操作成功
long userid = ((Long)((Hashtable)vRtn.elementAt(0)).get(“userid”)).longValue();

util.setTransNode(“insertUserInfo”);
util.setTransValue(“userid”, userid );
util.setTransValue(“email”, “test@test.com” );
util.setTransValue(“mobile”, “1234567890” );
Vector vRtn = util.insert( con );

对于 delete语句 分析( 6)程序如下
XMLUtils util = new XMLUtils();
util.setTransNode(“deleteUser”);
util.setTransKeyValue(“userid”, 100);
util.delete( con );

对于update语句,分析( 8)程序如下
XMLUtils util = new XMLUtils();
util.setTransNode(“updateUserInfo”);
util.setTransKeyValue(“userid”, 123);
util.setTransValue(“email”, “aaa@aaa.com”);
util.update( con );

大家在看这些SQL的操作时,是不是觉得很工整,也很舒服呢?这样做的好处很多,程序员可以不必太多的去拼写SQL 语句,封装的操作可以使所有程序员的程序都可以写的很工整,并有统一的风格。


Keli thisishnh@163.com


word文档放置于此 http://keli.nease.net/XMLDB.doc

最新jar包放置于 http://keli.nease.net/iartbean/iartbean.jar

Sample 放置于 http://keli.nease.net/iartbean/Sample.java
import  com.iart.DataBase.XMLControl.*;
import com.microsoft.*; 
import java.sql.*;
import java.util.*;
public class Sample{
 
 public static void main( String[] args ){
 
  XMLUtils  util = new XMLUtils();
  Connection  con = null;
  try{
   System.out.println("[StartupServlet]begin ==============================================");
   util.StartupServlet();
   System.out.println("[StartupServlet]end ==============================================");
   con = getConnection();
   System.out.println("[GetConnection]"+ con.toString() );
   //  
/*   util.setTransNode( "clear" );
   util.clear(con);
  
   util.setTransNode( "setpassbyname" );  
   util.setTransValue( "logonname", "keli2" );
   util.setTransValue( "username", "keli3" );
   util.setTransValue( "password", "hnh3" );
   util.insert(con);
*/
 
   util.setTransNode("backemail","selectRespCode");
   //util.setTransKeyValue( "starttime","2003-08-22 00:00:00.0" );
   //util.setTransKeyValue( "endtime","2003-08-22 23:59:59.0" );
   //util.setTransKeyValue( "docstatusid","2" );
 
   //util.setTransValue( "createtime","CURRENT_TIMESTAMP" );
  
 
  
/*   util.setTransNode("insertDocument");
   util.setTransValue( "doctypeid", "2");
   util.setTransValue( "docstatusid", "1" );
 
   Vector vRtn = util.insert(con);
*/ 
   Hashtable  vRtn = util.select(con, 0, -1 );
   System.out.println(vRtn.toString());
   System.out.println(((Vector)vRtn.get("DATA")).size());
 
   util.setTransNode("backemail","selectRespCode");
     vRtn = util.select(con, 2, 20 );
   System.out.println(vRtn.toString());
   System.out.println(((Vector)vRtn.get("DATA")).size());
 
   vRtn = util.select(con,3, 20 );
    System.out.println(vRtn.toString());
    System.out.println(((Vector)vRtn.get("DATA")).size());  
/*   util.setTransNode("selectmaxdoc");
   Vector  vResult = util.select(con);
   Long docid = (Long)((Hashtable)vResult.elementAt(0)).get("docid");  
 
   util.setTransNode("insertEmail");
   util.setTransValue( "mid", docid.toString());
   util.setTransValue( "subject", "test" );
   util.setTransValue( "targetaddr", "test@test.com" );
   util.setTransValue( "sourceaddr", "test@test.com" );
   util.setTransValue( "content", "test@test.com" );
 
   util.insert(con);
 
 
   util.setTransNode("selectemail");
   Vector  vResult1 = util.select(con);   
  
   for( int i=0; i< vResult1.size(); i++ )
   {
    Hashtable vColumn = (Hashtable)vResult1.elementAt(i);
    if( vColumn != null )
      System.out.println("1"+vColumn.toString() );    
   }
 
*/
 
/*   util.setTransNode( "deletebyname" );
   util.setTransKeyValue("logonname", "keli");  
   util.delete(con);
 

   util.setTransNode("getpassbyname");
   util.setTransKeyValue( "logonname", "%keli%" );
   Vector  vResult2 = util.select(con);
  
   for( int i=0; i< vResult2.size(); i++ )
   {
    Hashtable vColumn = (Hashtable)vResult2.elementAt(i);
    if( vColumn != null )
      System.out.println(vColumn.toString() );    
   }
*/  
  }catch( Exception ex ) 
  {
   ex.printStackTrace();
  }finally{
   try{
    con.close();
   }catch(Exception ex1)
   {
    System.out.println(ex1.getMessage());
   }
  }
 
 }
 
 public static Connection getConnection() throws Exception{
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  String  strCon = "jdbc:microsoft:sqlserver://localhost:1433;User=nlc;Password=nlc;DatabaseName=nlc";
       Connection conn = DriverManager.getConnection(strCon);  
  return conn;
 }

http://keli.nease.net/XMLDB.doc

最新jar包放置于 http://keli.nease.net/iartbean/iartbean.jar

Sample 放置于 http://keli.nease.net/iartbean/Sample.java
import  com.iart.DataBase.XMLControl.*;
import com.microsoft.*; 
import java.sql.*;
import java.util.*;
public class Sample{
 
 public static void main( String[] args ){
 
  XMLUtils  util = new XMLUtils();
  Connection  con = null;
  try{
   System.out.println("[StartupServlet]begin ==============================================");
   util.StartupServlet();
   System.out.println("[StartupServlet]end ==============================================");
   con = getConnection();
   System.out.println("[GetConnection]"+ con.toString() );
   //  
/*   util.setTransNode( "clear" );
   util.clear(con);
  
   util.setTransNode( "setpassbyname" );  
   util.setTransValue( "logonname", "keli2" );
   util.setTransValue( "username", "keli3" );
   util.setTransValue( "password", "hnh3" );
   util.insert(con);
*/
 
   util.setTransNode("backemail","selectRespCode");
   //util.setTransKeyValue( "starttime","2003-08-22 00:00:00.0" );
   //util.setTransKeyValue( "endtime","2003-08-22 23:59:59.0" );
   //util.setTransKeyValue( "docstatusid","2" );
 
   //util.setTransValue( "createtime","CURRENT_TIMESTAMP" );
  
 
  
/*   util.setTransNode("insertDocument");
   util.setTransValue( "doctypeid", "2");
   util.setTransValue( "docstatusid", "1" );
 
   Vector vRtn = util.insert(con);
*/ 
   Hashtable  vRtn = util.select(con, 0, -1 );
   System.out.println(vRtn.toString());
   System.out.println(((Vector)vRtn.get("DATA")).size());
 
   util.setTransNode("backemail","selectRespCode");
     vRtn = util.select(con, 2, 20 );
   System.out.println(vRtn.toString());
   System.out.println(((Vector)vRtn.get("DATA")).size());
 
   vRtn = util.select(con,3, 20 );
    System.out.println(vRtn.toString());
    System.out.println(((Vector)vRtn.get("DATA")).size());  
/*   util.setTransNode("selectmaxdoc");
   Vector  vResult = util.select(con);
   Long docid = (Long)((Hashtable)vResult.elementAt(0)).get("docid");  
 
   util.setTransNode("insertEmail");
   util.setTransValue( "mid", docid.toString());
   util.setTransValue( "subject", "test" );
   util.setTransValue( "targetaddr", "test@test.com" );
   util.setTransValue( "sourceaddr", "test@test.com" );
   util.setTransValue( "content", "test@test.com" );
 
   util.insert(con);
 
 
   util.setTransNode("selectemail");
   Vector  vResult1 = util.select(con);   
  
   for( int i=0; i< vResult1.size(); i++ )
   {
    Hashtable vColumn = (Hashtable)vResult1.elementAt(i);
    if( vColumn != null )
      System.out.println("1"+vColumn.toString() );    
   }
 
*/
 
/*   util.setTransNode( "deletebyname" );
   util.setTransKeyValue("logonname", "keli");  
   util.delete(con);
 

   util.setTransNode("getpassbyname");
   util.setTransKeyValue( "logonname", "%keli%" );
   Vector  vResult2 = util.select(con);
  
   for( int i=0; i< vResult2.size(); i++ )
   {
    Hashtable vColumn = (Hashtable)vResult2.elementAt(i);
    if( vColumn != null )
      System.out.println(vColumn.toString() );    
   }
*/  
  }catch( Exception ex ) 
  {
   ex.printStackTrace();
  }finally{
   try{
    con.close();
   }catch(Exception ex1)
   {
    System.out.println(ex1.getMessage());
   }
  }
 
 }
 
 public static Connection getConnection() throws Exception{
  Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
  String  strCon = "jdbc:microsoft:sqlserver://localhost:1433;User=nlc;Password=nlc;DatabaseName=nlc";
       Connection conn = DriverManager.getConnection(strCon);  
  return conn;
 }
}

上一篇:SQL安装问题总结 人气:25717
下一篇:SQL Server与Excel数据互导 人气:14084
浏览全部XML的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-23 Menalto Gallery v2.3 Rc1 多国语
2008-7-23 深度学习网址导航系统 v2.6.1
2008-7-23 因特达crm2008客户关系管理系统
2008-7-23 60度 CMS v1.0 Build 080723
2008-7-23 幻影动漫网视频系统(Ppdong) v1.
2008-7-23 好易祝福墙 2008
2008-7-23 APJE私服发布系统 v2.0 PHP版
2008-7-23 毕业论文在线指导系统源码
2008-7-23 Jacky法律在线网站源码
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵