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

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

Jun 01, 2016 pm 02:05 PM
namegunacapaiberoperasipangkalan datakenyataan

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

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Apakah prosedur yang disimpan di MySQL?Apakah prosedur yang disimpan di MySQL?May 01, 2025 am 12:27 AM

Prosedur yang disimpan adalah penyataan SQL yang dipraktikkan dalam MySQL untuk meningkatkan prestasi dan memudahkan operasi kompleks. 1. Meningkatkan prestasi: Selepas penyusunan pertama, panggilan seterusnya tidak perlu dikompilasi. 2. Meningkatkan Keselamatan: Mengatasi akses jadual data melalui kawalan kebenaran. 3. Memudahkan operasi kompleks: Campurkan beberapa pernyataan SQL untuk memudahkan logik lapisan aplikasi.

Bagaimanakah pertanyaan caching berfungsi di mysql?Bagaimanakah pertanyaan caching berfungsi di mysql?May 01, 2025 am 12:26 AM

Prinsip kerja cache pertanyaan MySQL adalah untuk menyimpan hasil pertanyaan pilih, dan apabila pertanyaan yang sama dilaksanakan sekali lagi, hasil cache dikembalikan secara langsung. 1) Cache pertanyaan meningkatkan prestasi bacaan pangkalan data dan mendapati hasil cache melalui nilai hash. 2) Konfigurasi mudah, set query_cache_type dan query_cache_size dalam fail konfigurasi MySQL. 3) Gunakan kata kunci sql_no_cache untuk melumpuhkan cache pertanyaan khusus. 4) Dalam persekitaran kemas kini frekuensi tinggi, cache pertanyaan boleh menyebabkan kesesakan prestasi dan perlu dioptimumkan untuk digunakan melalui pemantauan dan pelarasan parameter.

Apakah kelebihan menggunakan MySQL ke atas pangkalan data hubungan lain?Apakah kelebihan menggunakan MySQL ke atas pangkalan data hubungan lain?May 01, 2025 am 12:18 AM

Sebab mengapa MySQL digunakan secara meluas dalam pelbagai projek termasuk: 1. Prestasi tinggi dan skalabilitas, menyokong pelbagai enjin penyimpanan; 2. Mudah untuk digunakan dan mengekalkan, konfigurasi mudah dan alat yang kaya; 3. Ekosistem yang kaya, menarik sejumlah besar sokongan alat komuniti dan pihak ketiga; 4. Sokongan silang platform, sesuai untuk pelbagai sistem operasi.

Bagaimana anda mengendalikan peningkatan pangkalan data di MySQL?Bagaimana anda mengendalikan peningkatan pangkalan data di MySQL?Apr 30, 2025 am 12:28 AM

Langkah -langkah untuk menaik taraf pangkalan data MySQL termasuk: 1. Sandarkan pangkalan data, 2. Hentikan perkhidmatan MySQL semasa, 3. Pasang versi baru MySQL, 4. Mulakan versi baru MySQL Service, 5 pulih pangkalan data. Isu keserasian diperlukan semasa proses peningkatan, dan alat lanjutan seperti Perconatoolkit boleh digunakan untuk ujian dan pengoptimuman.

Apakah strategi sandaran yang berbeza yang boleh anda gunakan untuk MySQL?Apakah strategi sandaran yang berbeza yang boleh anda gunakan untuk MySQL?Apr 30, 2025 am 12:28 AM

Dasar sandaran MySQL termasuk sandaran logik, sandaran fizikal, sandaran tambahan, sandaran berasaskan replikasi, dan sandaran awan. 1. Backup Logical menggunakan MySqldump untuk mengeksport struktur dan data pangkalan data, yang sesuai untuk pangkalan data kecil dan migrasi versi. 2. Sandaran fizikal adalah cepat dan komprehensif dengan menyalin fail data, tetapi memerlukan konsistensi pangkalan data. 3. Backup tambahan menggunakan pembalakan binari untuk merekodkan perubahan, yang sesuai untuk pangkalan data yang besar. 4. Sandaran berasaskan replikasi mengurangkan kesan ke atas sistem pengeluaran dengan menyokong dari pelayan. 5. Backup awan seperti Amazonrds menyediakan penyelesaian automasi, tetapi kos dan kawalan perlu dipertimbangkan. Apabila memilih dasar, saiz pangkalan data, toleransi downtime, masa pemulihan, dan matlamat titik pemulihan perlu dipertimbangkan.

Apakah clustering mysql?Apakah clustering mysql?Apr 30, 2025 am 12:28 AM

Mysqlclusteringenhancesdatabaserobustnessandsandscalabilitybydistributingdataacrossmultiplenodes.itusesthendbenginefordatareplicationandfaulttolerance, ugeinghighavailability.setupinvolvesconfiguringmanagement, Data, dansqlnodes

Bagaimana anda mengoptimumkan reka bentuk skema pangkalan data untuk prestasi di MySQL?Bagaimana anda mengoptimumkan reka bentuk skema pangkalan data untuk prestasi di MySQL?Apr 30, 2025 am 12:27 AM

Mengoptimumkan reka bentuk skema pangkalan data di MySQL dapat meningkatkan prestasi melalui langkah -langkah berikut: 1. Pengoptimuman indeks: Buat indeks pada lajur pertanyaan biasa, mengimbangi overhead pertanyaan dan memasukkan kemas kini. 2. Pengoptimuman Struktur Jadual: Mengurangkan kelebihan data melalui normalisasi atau anti-normalisasi dan meningkatkan kecekapan akses. 3. Pemilihan Jenis Data: Gunakan jenis data yang sesuai, seperti INT dan bukannya VARCHAR, untuk mengurangkan ruang penyimpanan. 4. Pembahagian dan Sub-meja: Untuk jumlah data yang besar, gunakan pembahagian dan sub-meja untuk menyebarkan data untuk meningkatkan kecekapan pertanyaan dan penyelenggaraan.

Bagaimana anda boleh mengoptimumkan prestasi MySQL?Bagaimana anda boleh mengoptimumkan prestasi MySQL?Apr 30, 2025 am 12:26 AM

TooptimizeMySQLperformance,followthesesteps:1)Implementproperindexingtospeedupqueries,2)UseEXPLAINtoanalyzeandoptimizequeryperformance,3)Adjustserverconfigurationsettingslikeinnodb_buffer_pool_sizeandmax_connections,4)Usepartitioningforlargetablestoi

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa