|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
mysql使用内部操作字符集gbk来进行操作,即执行"SELECT*FROMtestWHEREname=xxxor1=1/*LIMIT1";从而注入成功数据
定制数据层
关头字:数据层,会见,元数据,数据会见模子
撰写:●⌒●┒tyt@sohu.com援用请说明出处
工夫:2003年8月
择要:在一个分层的体系中,数据层承当的义务是为体系供应必要的数据。在承先启后的过程当中,体系的变动,特别是体系数据请求的变动会让数据层忙的不亦乐乎。为此在疾苦的变动以后,我选择了数据会见模子,将元数据引进到数据层。使之有极强的扩大才能,变动才能。本文就将先容一个基础无需编程的数据层。
假如您利用的是小体系或已决意利用疾速绑定命据库表。本文大概对您不太符合。
观点的提出
在一个稍有范围的体系中,今朝一样平常会利用分层的计划。数据层的观点由此发生,为体系供应必需的数据,屏障数据存取,利用复杂易用的接话柄现数据操纵。它将完成Create,Read,Update,Delete(CRUD)的操纵来供应给下层……等等。
数据是一个软件体系的中心。尽年夜多半的数据保留在贸易数据库中,一样平常无需我们为此添枝加叶。数据层则是体系与数据库打交道的一个,也应当是独一的一个中央。
但是,体系的变动几近没法制止。用户现场提出,需求变动等等几近没法完整制止。同时一个开辟好的体系也大概必要利用分歧的数据库。变既然没法制止,不如主动面临。引进数据会见模子使得变动在数据层不必变动代码,乃至一个数据层组件能够顺应分歧的体系。也就是说--数据层的编程事情量几近已没有。
数据层模子
上图是一个部署模子。如图:数据层被分红了数据供应层和数据会见层,和一个数据会见元数据。上面分离先容这四个文件的感化:
数据会见元数据:
形貌数据的存取办法的数据,为体系的每个存取数据逻辑供应形貌,并利用数据会见点定名此会见逻辑,元数据存于数据库中。
通用数据会见层:
是一个组件,办理数据库驱动、屏障数据库不同、为下层供应复杂分歧的接口实行挪用。
通用数据供应组件:
利用通用数据会见层实行数据的CRUD操纵,利用数据会见元数据把持数据挪用指令。
公用数据供应组件:
假如数据会见元数据构建的数据会见模子构建得不充实,必要此组件供应需要的功效增补。
数据会见模子
此模子由数据会见元数据来形貌,因而元数据的界说必要功力。一方面:数据会见元数据越完整,通用数据供应组件功效就越强。兼容性也越好,但另外一方面,模子对照精致会让通用数据供应组件的编程对照庞大,因而必要衡量。
在必定的衡量后,我给出了以下的界说,以下界说已足以满意一样平常的必要:
它将存在两部分。数据库和当地缓存。
数据库中保留在数据会见元数据表DataAccessMeta。
当地缓存包括DataAccessMeta表的缓存,另有数据库的架构信息,包含,数据库中有甚么表,表中有几个字段,表中字段的属性,表间的束缚干系等。
列名域申明IDInt(notNULL)主键、独一标识符,默许自增1QueryNameVarchar(128)(notNULL)独一,数据会见点称号,即使用层的挪用的传进参数TypeInt(notNULL)保存会见种别,默许0,ReturnTypeInt(notNULL)0:多个数据表暗示一个数据集(默许)1:由多表分解一个表的数据集(静态视图)TransactionInt(notNULL)0:不必要事件撑持(默许)1:必要事件撑持SQLVarchar(512)存储SQL语句,可变参数值在字段名后面加@号暗示。StoreProcedureVarchar(64)存储历程称号ViewVarchar(64)视图称号Table_1Varchar(32)表名FieldName_1Varchar(256)Table_1字段名(指定要会见的字段)空,将前往表中一切字段。Table_2Varchar(32)表名FieldName_2Varchar(256)Table_2字段名(指定要会见的字段)空,将前往表中一切字段。Table_3Varchar(32)表名FieldName_3Varchar(256)Table_3字段名(指定要会见的字段)空,将前往表中一切字段。Table_4Varchar(32)表名FieldName_4Varchar(256)Table_4字段名(指定要会见的字段)空,将前往表中一切字段。Table_5Varchar(32)表名FieldName_5Varchar(256)Table_5字段名(指定要会见的字段)空,将前往表中一切字段Table_6Varchar(32)表名FieldName_6Varchar(256)Table_6字段名(指定要会见的字段)空,将前往表中一切字段
申明:
QueryName为数据存取逻辑的别号。下层经由过程此别号来挪用响应元数据表中优先级从上到下(关于同意为空的字段,但它存在时,疏忽其他。)好比SQL字段存在,将疏忽StoreProcedure及以下字段。在从表读数据时从Table_1读到Table_6,保留时倒序。SQL字段内容能够以传进进参数体例暗示,如"select*fromtablewhereusername=@username"即为一个正当的命令文本,我们能够以参数情势静态为@username赋值。当ReturnType为1时(把多表分解一表),各表之间必需要有且只要一个外键联系关系,查找干系的优先级从Table_1到Table_6。表毗连也是不异按次,因而注重表的前后干系别的,数据库中必需还要有一张版本表来辨别元数据的版本成绩。
当地缓存次要为了效力。最少包括三部分,下面的数据会见元数据缓存,数据库的架构缓存,版本缓存,即最少3个文件。
通用数据会见层
计划准绳:
简化dataaccesslogiccomponent中对数据库的操纵。数据存取举行会合处置,有益屏障数据库之间的不同。办理数据源。办理数据库的认证。办理事件性的操纵。办理数据库毗连。
应供应的接口有:
SetConnectPropety()//设置毗连属性SetDBType()//设置数据库范例,好比Oracle,SQLServerExecSQL()//实行SQL语句,注重必要依据数据库范例剖析成对应的语句。Update()//将数据集写进数据库Transactiong()//把持事件处置的相干函数GetDBTableName()//失掉数据库中的一切表名GetDBForeignKey()//失掉数据库中的一切外键干系
通用数据供应组件
计划准绳:
仅前往必要的数据。为分歧的挪用供应分歧接口。为输出输入参数供应复杂的映照和转换。使下层不必体贴数据存储。表露元数据的接口。查询参数,了局集的形貌等。处置一个主表和相干联的表。实行优化操纵和锁定等数据库操纵。缓存数据和非事件性的查询了局。在利用散布式或多半据库的体系下,供应静态的数据库路由。不要为每一个事件供应数据库的事件撑持,勤俭数据库资本。不该该初始化有交集的事件,由于大概会呈现多处同时更新的情形,激发冲突。不要在各个办法挪用时保持形态。不要为每一个表计划一个数据会见点,应当为每一个体系数据需求供应。本组件推行一个准绳,"体系不该当晓得数据从何而来,但程序员应当十分熟习。"
外部工具:
元数据办理类:卖力元数据的更新,缓存,读取,办理元数据内存缓冲,对效力的请求极高。数据供应类:卖力剖析数据会见元数据,并将剖析了局传进数据会见层。
应供应的接口有:
SetConnectPropety()//设置毗连属性GetDataSet(strAccessPoint,strFilter,strField)//取得数据集。个中strAccessPoint为数据会见点称号Update()//把数据集更新到数据库GetAccessPoint()//失掉一切的数据会见点称号GetFields(strAccessPoint)//失掉每一个数据会见点能够取得的字段名GetFieldProperty(strAccessPoint,strFieldName)//失掉每一个字段的属性
事情历程:
1.检测元数据和数据库版本。如更新,下载到当地。
2.将元数据,数据库架构读进内存,(约1张表1k的数据量)。
3.守候查询。
4.查询时剖析元数据,机关必要的SQL语句。
5.将SQL传进数据会见层。
6.失掉数据。
7.依据元数据将表间束缚填进数据集。
8.前往数据,守候查询。
结语:
元数据的利用。以致效力上有所下降。以是其实不合适对效力请求极高的体系。
我利用ADO.NET机关了一个本文所形貌的数据层。两人发了5周的工夫编码。使用优秀。以为对人人大概有些匡助。特撰写此文与人人共勉。
元数据的利用实在其实不仅限于数据层,如若把界面,功效元数据分离,人人能够设想将会呈现甚么了局,只不外数据层的元数据简单归结罢了。
本组件在http://www.csdn.net/cnshare/soft/19/19227.shtm已公布。
EXAMPLE存储引擎是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE存储引擎不支持编索引。 |
|