抽象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.mzph.cn/news/279758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用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.原生海…

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) 是…

离开互联网行业_如何使用互联网再也不会离开家

离开互联网行业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.编辑界面添加视图 使用编辑界面添加视图是一个相当简单的工…

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;…

如何在Word文档中添加页眉或页脚

Headers and footers are useful for adding things such as page numbers, dates, file names, and disclaimers to documents. Word allows you to add headers and footers with built-in, ready-made layouts or add your own custom headers and footers. 页眉和页脚对于在…

双11成交多少和我无关,但这个魔性MV真的让我笑喷!

今年天猫双11&#xff0c;印象最深的就是“祝你双11快乐”这句话&#xff01;它让大家感觉到双11不再只是一个购物节&#xff0c;而是一个能引起广泛共鸣、让大家有快乐情感的真正节日。以往的传统节日&#xff0c;都有一个标志性的符号&#xff0c;正如脑海中的每年春晚&#…

ios beta 下载_如何回滚到iOS 10(如果您使用的是iOS 11 Beta)

ios beta 下载So you’ve installed the iOS 11 beta and, well, you don’t love it. No problem, because you can roll right back to iOS 10. 因此&#xff0c;您已经安装了iOS 11 Beta &#xff0c;但是&#xff0c;您不喜欢它。 没问题&#xff0c;因为您可以直接回滚到i…

instagram发布工具_如何在不发布照片的情况下保存已编辑的Instagram照片

instagram发布工具Unfortunately, there’s no built-in method for saving your edited Instagram photos without posting them first. However, with this neat trick, you can add Instagram filters to your photos and save them locally to your phone without actually…

Verify the Developer App certificate for your account is trusted on your device.

1、报错内容 Could not launch “CH5203” Verify the Developer App certificate for your account is trusted on your device. Open Settings on 测试 and navigate to General -> Device Management, then select your Developer App certificate to trust it. 2、解决方…

HTTP2和HTTPS来不来了解一下?

一、前言 只有光头才能变强 HTTP博文回顾&#xff1a; PC端&#xff1a;HTTP就是这么简单PC端&#xff1a;HTTP面试题都在这里微信公众号端&#xff1a;HTTP就是这么简单微信公众号端&#xff1a;HTTP面试题都在这里本文力求简单讲清每个知识点&#xff0c;希望大家看完能有所收…