根据这段声明,可以知道:
Product类实例的id属性替换SQL中的第一个“?”,它的description属性替换第二个“?”。这种映射虽然简单,大部分开发人员更偏向于通过命名、内联的方式处理这些映射,但有些时需要提供额外的信息才能完成时,使用这种标准的SQL格式来完成就显得更加方便。
7.2.5.3parameterClass
如果parameterMap属性不是专用的,那么可以在文档中声明一个parameterClass,通过内联的方式来引用。它的值来可以是类的别名,也可以是全名。下例给出了声明parameterClass的方法:
7.2.5.4resultMap
这个属性使得我们可以控制从查询获得什么样的数据,并且返回结果的各列与对象的属性是如何对应的。 7.2.5.5resultClass resultClass的值可以是类的别名,也可以是类的全名。通过这个声明的类映射框架自动完成查询结果的列与对象 PER_FIRST_NAMEasFirstName,PER_LAST_NAMEasLastName,PER_BIRTH_DATEasBirthDate,PER_WEIGHT_KGasWeightInKilograms,PER_HEIGHT_MasHeightInMetersFROMPERSON WHEREPER_ID=#value# (下图的内容能够更好的体现出这个属性的意义) Person类具有蓝色字体所标识的属性,SQL语句为列命名别名的方式使得查询结果的各列与Person类的属性相对应。虽然可以在SQL使用列别名方式可以保持列与类属性之间的对应关系,但是,这种使用是有限的。对于复杂属性来说,没有办法自动加载映射的数据。如果没有确定输出列的类型,那么就没有办法自动为复合属性加载对应的数据。从结构上而言,列别名这种方式把数据库逻辑和数据表现逻辑(reportinglogic)进行了混合,使得查询更加难以读取和维护。在这些限制范围内,我们可以使用确定的结ResultMap。 7.2.5.6listClass 为了支持从数据库操作中获取对象列表,DataMapper提供了对强类型自定义集合(System.Collections.CollectionBase抽象类的实现类)的支持。下面是个例子:usingSystem; usingSystem.Collections; namespaceWebShop.Domain{ publicclassAccountCollection:CollectionBase{ publicAccountCollection(){} publicAccountthis[intindex]{ get{return(Account)List[index];}set{List[index]=value;}} publicintAdd(Accountvalue){ returnList.Add(value);} publicvoidAddRange(Account[]value){ for(inti=0;i Add(value[i]);}} publicvoidAddRange(AccountCollectionvalue){ for(inti=0;i Add(value[i]);}} publicboolContains(Accountvalue){ returnList.Contains(value);} publicvoidCopyTo(Account[]array,intindex){ List.CopyTo(array,index);} publicintIndexOf(Accountvalue){ returnList.IndexOf(value);} publicvoidInsert(intindex,Accountvalue){ Account.Insert(index,value);} publicvoidRemove(Accountvalue){ Account.Remove(value);}} } 通过listClass属性可以为一个select语句指定一个CollectionBase类。listClass属性值就是这个类的别名或者全名。还需要为查询语句指定resultClass属性,这样DataMapper才能直到如何设置对象表中各个对象的属性值。如下所示: 7.2.5.7cacheModel 如果需要对查询结果进行高速缓存设置,可以在 设置中的意义:每24小时刷新一次高速缓存,或者有相关量的更新语句执行后刷新一次。 7.2.5.8extends 编写SQL的时候,经常会遇到部分SQL内容会重复。iBATIS提供了一个简单实用的属性来简化这样的SQL。 7.3参数映射和内联参数映射 对于绝大部分SQL指令来说能够通过运行时传递参数来执行。例如某人需要获取数据库ID值为42的记录,那么就需要把ID值合并到select指令中。在运行时,向SQL指令传递一个或多个参数表,每个参数替换指令中的一个变量。 注:前面接触过内联参数,对于内联参数来说,它自动把属性与同名参数相匹配,而且很多开发人员都喜欢这种方式使用参数。但也有不少人更喜欢通过使用参数映射将SQL参数标准化,隐藏化。有些情况下,人们需要维持SQL指令的简洁性,有时又由于数据库或者数据提供者的需要提供详细的SQL指令。 一个参数映射定义了一个与带参数查询指令中的参数相匹配的值列表。虽然参数都有自己的名称,但是仍然需要把声明的属性按照规定的正确先后顺序排列。 ParameterMaps可由两种方式提供,外部方式/内联方式(external/inline)。下例是一个外部方式语法构成:externalParameterMap parameterMap元素只有id属性是必须的,其它属性是可选的。class属性是可选的,但建议尽量使用它,因为class属性用于帮助验证输入参数,优化性能。下例是一个典型的 通过映射定义文件中的命名空间,可以在一个定义文件中引用另一个文件中的参数映射,方法就是在映射参数的id前加上命名空间做前缀,格式如下: 命名空间.映射参数 Product.insert-product-param 7.3.1 它接受3个属性:id(必须),class(可选),andextends(可选)。 7.3.1.1id 要求:在数据映射中具有唯一性 7.3.1.2class Class是可选的属性,用于声明 7.3.1.3extends 如果A 7.3.2 7.3.2.1property 7.3.2.2column 用于为存储过程定义参数名称。 7.3.2.3direction 用于声明存储过程的参数方向(Input,Output,inputOutput). 7.3.2.4dbType 用于声明把property映射的数据库列设置成什么样的数据类型。在一些操作中,某些ADO.NET提供者不能确定列的类型,需要对列的类型进行声明。 这个属性一般只用在列可以为空值的情况下。虽然.NET只有一种Date类型(System.DateTime),但是大部分数据库有多种Date类型。一般来讲,数据库通常有三种不同的日期类型——Date,Datetime,Timestamp。为了正确映射列值,我们应该指定列的数据类型。 7.3.2.5type 用于为参数的对象属性指定CLR数据类型。这个属性在用于相存储过程传递inputOutput和Output性质的参数时是需要用到的。一般来说,对象属性类型可以通过反射机制来获取,但是那些用对象作映射的mappings却不能得到属性的类型。如果没有设置type属性,映射框架也不能获取到属性类型,在此情况下,它的类型就被假定为Object型。 7.3.2.6nullValue 设置了这个属性值之后(如类Sample的A属性nullValue值为-1(整型),如果对象Sample的A属性值为-1时,与sample.A属性对应的变量值就会算做NULL.写入数据库。 7.3.2.7Size 用于设置列值的最大值。 7.3.2.8precision7.3.2.9scale7.3.2.10typeHandler 用于设置用户自定义类型。 7.3.3内联参数映射(InlineParameterMaps) 内联参数映射语法允许我们把属性名称、属性类型、列类型、null值放置在SQL指令中。下面的四个例子演示了内联参数方式。(1)