抽象SQL查詢:SQL-MAP技術的使用

什么是參數化查詢?我們來看百度百科對此的定義和示例:

一,定義

------------------------------------------------------------------

 參數化查詢(Parameterized Query 或 Parameterized Statement)是指在設計與數據庫鏈接并訪問數據時,在需要填入數值或數據的地方,使用參數 (Parameter) 來給值,這個方法目前已被視為最有效可預防SQL注入攻擊 (SQL Injection) 的攻擊手法的防御方式。

  有部份的開發人員可能會認為使用參數化查詢,會讓程序更不好維護,或者在實現部份功能上會非常不便,然而,使用參數化查詢造成的額外開發成本,通常都遠低于因為SQL注入攻擊漏洞被發現而遭受攻擊,所造成的重大損失。

原理

  在使用參數化查詢的情況下,數據庫服務器不會將參數的內容視為SQL指令的一部份來處理,而是在數據庫完成 SQL 指令的編譯后,才套用參數運行,因此就算參數中含有具有損的指令,也不會被數據庫所運行。

SQL 指令撰寫方法

  在撰寫 SQL 指令時,利用參數來代表需要填入的數值,例如:

Microsoft SQL Server

  Microsoft SQL Server 的參數格式是以 "@" 字符加上參數名稱而成,SQL Server 亦支持匿名參數 "?"。

  SELECT * FROM myTable WHERE myID = @myID

  INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)

Microsoft Access

  Microsoft Access 不支持具名參數,只支持匿名參數 "?"。

  UPDATE myTable SET c1 = ?, c2 = ?, c3 = ? WHERE c4 = ?

MySQL

  MySQL 的參數格式是以 "?" 字符加上參數名稱而成。

  UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4

?

Oracle

  Oracle 的參數格式是以 ":" 字符加上參數名稱而成。

  UPDATE myTable SET c1 = :c1, c2 = :c2, c3 = :c3 WHERE c4 = :c4

?

PostgreSQL

  PostgreSQL 的參數格式是以 "$" 字符加上參數順序號而成。

  UPDATE myTable SET c1 = $1, c2 = $2, c3 = $3 WHERE c4 = $4

???? PostgreSQL也支持Oracle的參數表示形式

?

--------------------------------------------------------------------------------

總結一下各數據庫對于參數符號的定義:

SQLSERVER @

Access,MySQL ?

Oracle :

PostgreSQL $

?

上面的這些符號是各數據庫內部原生支持的方式,但是具體到ADO.NET調用的時候,

采用各數據庫原生的.NET驅動程序,發現除了Oracle,各種數據庫都可以在SQL語句中用@符號表示參數;

采用各數據庫的OleDB或者ODBC驅動程序,都要求使用 ?符號表示參數。

?

還有其它本文未說到的數據庫,他們的SQL語句表示參數的符號可能都是不一樣的,怎么樣在程序里面統一處理呢?本文主題開始了:

?

二,抽象SQL參數化查詢

在PDF.NET(PWMIS數據開發框架)中,對參數的定義統一采用##來處理,具體格式如下:

#參數名字[:參數類型],[數據類型],[參數長度],[參數輸出輸入類型]#

上面定義當中,中括號里面的內容都是可選的。

詳細內容,請參看“SQL-MAP” 或者“PDF.NET(PWMIS數據開發框架)之SQL-MAP目標和規范

?

對本文第一部分的示例,可以改寫成下面的方式:

?

復制代碼
UPDATE?myTable?SET?
c1?
=?#c1#,?
c2?
=?#c2:String#,?
c3?
=?#c3:String,Sring,50#?
WHERE?c4?=?#c4:Int32#
復制代碼

如果不指定參數的類型,默認為String類型,例如c1參數。

程序在運行時,會根據當前具體的數據庫訪問程序實例,將##內部的參數替換成合適的參數內容。

?

上面這種參數形式是寫在SQL-MAP配置文件里面的,例如下面的一個實際的SQL-MAP查詢腳本:

?

復制代碼
?<Select?CommandName="GetStatisticsAnalysis_SalerRoleStatistics"?CommandType="Text"?Method=""?Description=""?ResultClass="DataSet">
????????
<![CDATA[
?????SELECT?a.角色,a.銷售金額/10000?銷售金額,a.占比?FROM?[GetStatisticsAnalysis_SalerRoleStatistics]?(
????#manageid:Int32#,?#min:String#,?#max:String#)?a
]]>
??????
</Select>
復制代碼

?

如果想使用動態SQL語句,即SQL語句中有一個“假參數”,在運行時由另外一個字符串來替換的,例如非常復雜的查詢條件拼接過程,請參看:

?

在SQLMAP中使用動態SQL

?

通過這種方式,完全屏蔽了不同種類的數據庫查詢的參數問題,將SQL參數化查詢抽象了出來。

?

看到這里本文似乎該結束了,但本文的標題“參數化”加了一個括號,說明我們抽象的不僅僅是參數,我們還可以抽象整個SQL查詢。

?

三,抽象SQL查詢:SQL-MAP技術

在本文第二部分,我們將SQL中的參數“抽象化”了,我們還可以進一步抽象整個SQL,看下面的抽象過程:

  1. 編寫任意形式的合法SQL查詢語句;
  2. 抽象SQL中的參數;
  3. 將整個SQL語句抽象成一個唯一名字為CommandName;
  4. 將一組CommandName映射到一個DAL類文件;
  5. 將這個CommandName映射到一個DAL類的方法名稱;
  6. 將SQL語句中的參數名稱映射到該DAL類的當前方法中的參數名稱;
  7. 將整個SQL腳本文件映射到一個DAL程序集。

?

這個思想,就是SQL-MAP,將SQL語句映射為程序!

?

下面我們介紹一下PDF.NET數據開發框架對于存儲過程的操作思路,對于單條SQL也是如此。當然,單條SQL語句的操作我們不必請出SQL-MAP這種“重量級”的方式,還是使用框架中的ORM技術OQL吧,但這不是本文討論的話題。


首先,在SQL-MAP配置文件里面寫下面的腳本:

<Select?CommandName="GetProductManage_FundSaleAndAIP"?Method=""?CommandType="Text"?Description="獲取XXX列表"?ResultClass="DataSet">

2 ???????<![CDATA[
3 ????????select * from GetProductManage_FundSaleAndAIP(#Type:String#,#Name:String#,#isAIP:String#)
4 ???????]]>
5 ?????</Select>
注意腳本中的ResultClass屬性,它可以將查詢映射成為單值,DataSet,實體類,實體類集合。
有了這個SQL-MAP文件,我們可以使用代碼工具自動生成下面的代碼(當然你也可以手寫):
01/// <summary>
02 ???/// 獲取XXXXX列表
03 ???/// </summary>
04 ???/// <param name="Type"></param>
05 ???/// <param name="Name"></param>
06 ???/// <param name="isAIP"></param>
07 ???/// <returns></returns>
08 ???public?DataSet GetProductManage_FundSaleAndAIP(String Type? , String Name? , String isAIP?? )?
09 ???{?
10 ???????????//獲取命令信息
11 ???????????CommandInfo cmdInfo=Mapper.GetCommandInfo("GetProductManage_FundSaleAndAIP");
12 ???????????//參數賦值,推薦使用該種方式;
13 ???????????cmdInfo.DataParameters[0].Value = Type;
14 ???????????cmdInfo.DataParameters[1].Value = Name;
15 ???????????cmdInfo.DataParameters[2].Value = isAIP;
16 ???????????//參數賦值,使用命名方式;
17 ???????????//cmdInfo.SetParameterValue("@Type", Type);
18 ???????????//cmdInfo.SetParameterValue("@Name", Name);
19 ???????????//cmdInfo.SetParameterValue("@isAIP", isAIP);
20 ???????????//執行查詢
21 ???????????return?CurrentDataBase.ExecuteDataSet(CurrentDataBase.ConnectionString, cmdInfo.CommandType, cmdInfo.CommandText , cmdInfo.DataParameters);
22 ???????//
23 ???}//End Function

從上面的過程可以看出,框架采用SQL-MAP技術,將SQL語句(包括各種查詢的單條SQL語句和存儲過程等)映射成了DAL層代碼,整個過程不需要了解.NET開發技術,所以DAL層的代碼完全可以由DBA來寫,而業務開發人員只要調用DAL代碼即可。

采用這種技術,DBA可以寫高效的有數據庫特性的SQL,如果要換數據庫,只需要換一個配置文件即可,不需要重寫程序。

題外話:
SQL-MAP思想并非PDF.NET數據開發框架獨有,實際上,該思想也是從著名的iBatis框架借鑒而來的,但與iBatis不同的是,PDF.NET的SQL-MAP參數不需要定義專門的“參數類”,也不需要寫額外的XML文件指明查詢結果如何與實體類映射,所以整個開發過程大大簡化,簡化到你只需要會寫SQL語句,就可以寫DAL代碼。

?


? ? 本文轉自深藍醫生博客園博客,原文鏈接:http://www.cnblogs.com/bluedoctor/archive/2011/05/06/2038727.html,如需轉載請自行聯系原作者



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279758.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279758.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279758.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EF ORM

//新增UserInfo userInfo new UserInfo();userInfo.UserName "YANG";userInfo.UserPass "123";userInfo.Email "253qq.com";userInfo.RegTime System.DateTime.Now;Model1Container db new Model1Container();db.UserInfoSet.Add(userInfo…

如何使用echo.js實現圖片的懶加載(整理)

如何使用echo.js實現圖片的懶加載&#xff08;整理&#xff09; 一、總結 一句話總結&#xff1a;a、在img標簽中添加data-echo屬性加載真實圖片&#xff1a;<img class"loading" src"blank.gif" data-echo"圖片真實路徑" />&#xff0c;在…

還原出廠設置 擦除frp_如何備份,擦除和還原Apple Watch

還原出廠設置 擦除frpThe Apple Watch is, in its own right, a little tiny computer with data backup and security needs. Read on as we show you how to ensure your Apple Watch is backed up, wiped, and restored just like you’d do with your smartphone. Apple Wa…

exchange 2010 search mailbox 的幕后強大功能

鈴……….半夜中被一陣急促的手機鈴聲吵醒&#xff0c;年度服務客戶打來電話需要進行郵件的排查和刪除工作。問其原因&#xff0c;原來是組織中有人發了一封關于領導的不健康的郵件&#xff0c;并在企業內部進行了轉發&#xff0c;領導要求立即找出此類郵件并進行刪除。管理員深…

Apache HBase的現狀和發展

一、&#xff28;Base是什么 HBase(Hadoop Database)&#xff0c;是一個基于Google BigTable論文設計的高可靠性、高性能、可伸縮的分布式存儲系統。 它有以下特征&#xff1a; 1.HBase仍然是采用行存儲的&#xff0c;采用松散表的結構來獲得動態列的功能&#xff1b; 2.原生海…

Java的接口、繼承與多態

接口 java只支持單繼承&#xff0c;即一個類只能有一個父類&#xff0c;因此需要接口來實現多重繼承。 接口的定義 類和接口的區別&#xff1a;一個類通過繼承接口的方式&#xff0c;從而來繼承接口的抽象方法。類描述對象的屬性和方法&#xff0c;接口則包含類要實現的方法。 …

dvd刻錄軟件_如何在Windows 7中刻錄照片和視頻DVD(無需額外的軟件)

dvd刻錄軟件Software like DVD Flick is great for burning video to DVDs, but Windows 7 actually includes built-in DVD burning software. Strangely, it’s the last time the company did so—while Windows 8 and Windows 10 can play back DVD movies, they can’t cr…

如何實現office不同語言界面切換

前面我討論了《如何實現win7不同語言界面切換》&#xff0c;很巧今天又有網友問到如何實現 office的語言界面切換呢。嘿&#xff0c;那我們就繼續來玩轉界面吧。 office2007和office2010也支持輕松的進行語言界面切換&#xff0c;操作步驟也很簡單。 Office 語言界面包 (LIP) 是…

Mysql-高可用集群[MyCat中間件使用](三)

服務器-節點: 4臺 mysql-主: 192.168.2.40mysql-從-node-0: 192.168.2.41mysql-從-node-1: 192.168.2.42mycat: 192.168.2.45操作過程 1.搭建mysql主從節點2.搭建mycat中間件節點3.mycat服務配置4.測試讀寫分離,讀的分發1.搭建mysql主從節點 Mysql-高可用集群主從單一模式-binl…

yum安裝mysql5.6

1.檢查系統是否安裝其他版本的MYSQL數據 yum list installed | grep mysql yum -y remove mysql-libs.x86_64 2.安裝及配置 wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm rpm -ivh mysql-community-release-el6-5.noarch.rpm yum repolist all | grep…

離開互聯網行業_如何使用互聯網再也不會離開家

離開互聯網行業Thanks to the Internet, activities like “going outside” or “being a productive member of the community” are becoming increasingly optional parts of daily life. When your inner hermit feels like putting on his vampire cape, simple tricks l…

iOS 11開發教程(十三)iOS11應用編輯界面添加視圖

iOS 11開發教程&#xff08;十三&#xff09;iOS11應用編輯界面添加視圖 在iOS中添加視圖的方式有兩種&#xff1a;一種是使用編輯界面添加視圖&#xff1b;另一種是使用代碼添加視圖。以下是這兩個方式的詳細介紹。 1.編輯界面添加視圖 使用編輯界面添加視圖是一個相當簡單的工…

限流算法(記錄cyc大佬的專欄)

限流的必要性 如果一段時間內請求的數量過大&#xff0c;就會給服務器造成很大壓力&#xff0c;可能導致服務器無法提供其它服務。 計數器算法 通過一個計數器 counter 來統計一段時間內請求的數量&#xff0c;并且在指定的時間之后重置計數器。該方法實現簡單&#xff0c;但是…

bzoj 1024 [ SCOI 2009 ] 生日快樂 —— 遞歸

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1024 因為每次把一塊切成兩塊&#xff0c;所以可以枚舉從哪里切開&#xff0c;然后遞歸求解&#xff1b; 一開始用了不太對的貪心思路&#xff0c;想著一定去切較長邊&#xff0c;但看來不一定。 代碼如下&a…

HBase存儲剖析與數據遷移

1.概述 HBase的存儲結構和關系型數據庫不一樣&#xff0c;HBase面向半結構化數據進行存儲。所以&#xff0c;對于結構化的SQL語言查詢&#xff0c;HBase自身并沒有接口支持。在大數據應用中&#xff0c;雖然也有SQL查詢引擎可以查詢HBase&#xff0c;比如Phoenix、Drill這類。但…

windows os x_如何立即在OS X上獲取Windows樣式的窗口捕捉

windows os xApple’s recent announcement that the upcoming OS X release (El Capitan or 10.11) will finally, at long last, come with the ability to snap windows to your screen edges. A feature Windows users have enjoyed since 2009. 蘋果公司最近宣布即將發布的…

Install Odoo 11 on CentOS 7

2019獨角獸企業重金招聘Python工程師標準>>> Odoo is the most popular all-in-one business software in the world. It offers a range of business applications including CRM, website, e-Commerce, billing, accounting, manufacturing, warehouse, project m…

創建maven項目,配置maven地址

2019獨角獸企業重金招聘Python工程師標準>>> 在eclipse中&#xff0c;新建maven項目next第二步&#xff0c;選擇webapp輸入id及包名&#xff0c;完成新建給項目build path&#xff0c;添加1.8版本jdk和tomcat項目右鍵屬性 project Facets&#xff0c;切換成web項目&…

如何在Excel中隱藏單元格,行和列

There may be times when you want to hide information in certain cells or hide entire rows or columns in an Excel worksheet. Maybe you have some extra data you reference in other cells that does not need to be visible. 有時您可能想在某些單元格中隱藏信息或在…

金三銀四,跳槽為敬

不是不想跳&#xff0c;是如今的市場水冷&#xff0c;挪不開腳。 三月有“黃金”。 過去很多年&#xff0c;這個被譽為市場黃金期的階段&#xff0c;最熱鬧的旗幟屬于房地產&#xff0c;其次是人才市場。跳槽二字&#xff0c;充滿誘惑。對每一個想要改變的人而言&#xff0c;…