首頁 資料庫 mysql教程 使用XML封装数据库操作语句的实现_MySQL

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

Jun 01, 2016 pm 02:05 PM
name 使用 實現 操作 資料庫 語句

在项目开发的过程当中,项目组开发成员的编程风格差异和数据库操作语句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
2
3
4
5

6

在第一行的句子中使用 dbtrans 为节点名称,
属性name为这个交易的名称,这里为“selectUser”,
属性table为索取表的名称,这里为“TBL_USER”,
属性method为操作数据库的方法,这里为“select”,
子节点意思为从数据库读取数据。
子节点为读取的数据库字段,其中:
属性name为字段的名字,
属性type 为字段的类型,这里设置类型在后面的程序中可以体现出来。

对于“SELECT USERNAME, PASSWORD FROM TBL_USER WHERE USERID=123”语句,我们根据上述的分析,则可将XML描绘为:
分析(2)
1.
2.
3
4

5
6
7
8

9

如果使用的是like操作,我们可以将第3句描述成为

对于“SELECT USERNAME, PASSWORD FROM TBL_USER ORDER BY USERNAME DESC”这个语句,XML如下分析:
分析(3)
1.
2
3
4
5

6
7

这样的语句分析基本上可以完成了绝大部分的普通数据库的select语句的操作,但是毕竟还是会有一些我们无法预料的数据库操作语句会出现,比如
“SELECT USERNAME, PASSWORD FROM TBL_USER WHERE CREATETIME >‘2003-7-16’ AND CREATETIME之中,这时我们可以将XML描绘成为:

”>

但即使使用了以上的变通方法,还是会有很多的特殊语句是无法完成的,比如 “ SELECT COUNT(*) FROM TBL_USER ”, 这时的操作会出现使用XML语句无法描绘的时候,这个时候我们就可以引入了special这个属性,例如:
分析(4)
1
2

这个属性的意思是将所有的特殊交易都特殊表现出来。

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.
2
3
4
5
6

7

以及
1
2
3
4
5
6

7

C、分析DELETE语句

Delete语句最常用的可以分为两种,一种是按照键值删除,一种是全部删除,为此我们将此操作划分为两种类型,delete和clear
对于delete类型,举例为:
DELETE FROM TBL_USER_INFO WHERE USERID=123
描述为:
分析(6)
1
2
3
4

5

对于clear类型,举例为:
DELETE FROM TBL_USER_INFO
描述为:
分析(7)
1
2

D、分析UPDATE语句

从update通常的操作我们可以知道使用XML描述时将会出现两种tag,包括,比如:
UPDATE TBL_USER_INFO SET EMAIL=’aaa@aaa.com’ WHERE USERID=123
描述称XML为:
分析8)
1.
2
3
4

5
6
7

8

二、程序设计

好的,在分析了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 {
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 {
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 {
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 {
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;
}
}

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? Apr 26, 2024 am 09:40 AM

MetaMask(中文也叫小狐狸錢包)是一款免費的、廣受好評的加密錢包軟體。目前,BTCC已支援綁定MetaMask錢包,綁定後可使用MetaMask錢包進行快速登錄,儲值、買幣等,且首次綁定還可獲得20USDT體驗金。在BTCCMetaMask錢包教學中,我們將詳細介紹如何註冊和使用MetaMask,以及如何在BTCC綁定並使用小狐狸錢包。 MetaMask錢包是什麼? MetaMask小狐狸錢包擁有超過3,000萬用戶,是當今最受歡迎的加密貨幣錢包之一。它可免費使用,可作為擴充功能安裝在網絡

小米汽車app怎麼用 小米汽車app怎麼用 Apr 01, 2024 pm 09:19 PM

小米汽車軟體提供遠端車控功能,讓使用者可以透過手機或電腦遠端控制車輛,例如開關車輛的門窗、啟動引擎、控制車輛的空調和音響等,下文就是這個軟體的使用及內容,一起了解下吧。小米汽車app功能及使用方法大全1、小米汽車app在3月25日上線蘋果AppStore,現在安卓手機的應用商店中也可以下載了;購車:了解小米汽車核心亮點和技術參數,可預約試駕、配置訂購您的小米汽車,支援線上處理提車待辦事項。 3.社群:了解小米汽車品牌資訊,交流用車體驗,分享精彩車生活;4、車控:手機就是遙控器,遠端控制,即時安防,輕

iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 iOS 18 新增「已復原」相簿功能 可找回遺失或損壞的照片 Jul 18, 2024 am 05:48 AM

蘋果公司最新發布的iOS18、iPadOS18以及macOSSequoia系統為Photos應用程式增添了一項重要功能,旨在幫助用戶輕鬆恢復因各種原因遺失或損壞的照片和影片。這項新功能在Photos應用的"工具"部分引入了一個名為"已恢復"的相冊,當用戶設備中存在未納入其照片庫的圖片或影片時,該相冊將自動顯示。 "已恢復"相簿的出現為因資料庫損壞、相機應用未正確保存至照片庫或第三方應用管理照片庫時照片和視頻丟失提供了解決方案。使用者只需簡單幾步

Hibernate 如何實作多型映射? Hibernate 如何實作多型映射? Apr 17, 2024 pm 12:09 PM

Hibernate多態映射可映射繼承類別到資料庫,提供以下映射類型:joined-subclass:為子類別建立單獨表,包含父類別所有欄位。 table-per-class:為子類別建立單獨資料表,僅包含子類別特有列。 union-subclass:類似joined-subclass,但父類別表聯合所有子類別列。

在PHP中使用MySQLi建立資料庫連線的詳盡教學 在PHP中使用MySQLi建立資料庫連線的詳盡教學 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立資料庫連線:包含MySQLi擴充(require_once)建立連線函數(functionconnect_to_db)呼叫連線函數($conn=connect_to_db())執行查詢($result=$conn->query())關閉連線( $conn->close())

如何在PHP中處理資料庫連線錯誤 如何在PHP中處理資料庫連線錯誤 Jun 05, 2024 pm 02:16 PM

PHP處理資料庫連線報錯,可以使用下列步驟:使用mysqli_connect_errno()取得錯誤代碼。使用mysqli_connect_error()取得錯誤訊息。透過擷取並記錄這些錯誤訊息,可以輕鬆識別並解決資料庫連接問題,確保應用程式的順暢運作。

深入解析HTML如何讀取資料庫 深入解析HTML如何讀取資料庫 Apr 09, 2024 pm 12:36 PM

HTML無法直接讀取資料庫,但可以透過JavaScript和AJAX實作。其步驟包括建立資料庫連線、發送查詢、處理回應和更新頁面。本文提供了利用JavaScript、AJAX和PHP來從MySQL資料庫讀取資料的實戰範例,展示如何在HTML頁面中動態顯示查詢結果。此範例使用XMLHttpRequest建立資料庫連接,發送查詢並處理回應,從而將資料填入頁面元素中,實現了HTML讀取資料庫的功能。

什麼是Bitget Launchpool?如何使用Bitget Launchpool? 什麼是Bitget Launchpool?如何使用Bitget Launchpool? Jun 07, 2024 pm 12:06 PM

BitgetLaunchpool是一個為所有加密貨幣愛好者而設計的動態平台。 BitgetLaunchpool以其獨特的產品脫穎而出。在這裡,您可以質押您的代幣來解鎖更多獎勵,包括空投、高額回報,以及專屬早期參與者的豐厚獎金池。什麼是BitgetLaunchpool? BitgetLaunchpool是一個加密貨幣平台,可以透過使用者友善的條款和條件來質押和賺取代幣。透過在Launchpool中投入BGB或其他代幣,用戶有機會獲得免費空投、收益和參與豐厚的獎金池。質押資產的收益在T+1小時內計算,獎勵按

See all articles