(2)嵌入dbTypes信息
(3)嵌入dbType和空值信息
(4)与JavaDataMapper语法类似的方式:
注意:
(1)在使用内联参数映射的情况下,不能在没有数据类型声明的状态下设置空值。必须按照解析顺序逐个进行设置才行。(2)内联参数映射是个比较简单的工作,但在有大量类型定义和空值定义的情况下,外部参数映射显得更容易一些。7.3.4标准类型的参数
实际应用中,我们会发现许多SQLzhiing只需要一个简单的参数,如integer或string。与其把一个简单类型的值嵌入在某个对象中,还不如直接把标准库对象(String,Integer等等)作为参数进行传递。下例中演示了简单标准类型参数的使用方法:
假设PRD_ID是个数值类型的字段,那么调用这个SQL指令时,只需要传入一个标准的Interger型对象,用其值替换#value#,从而产生可执行的正确SQL指令。Value只是一个替换符的标记,我们也可以使用其它的标记。为了使用的方便,映射框架对这些原始类型的别名进行了预定义,例如:int可以代替“System.Integer”。7.3.5字典类参数映射
IDictionary实例通常是个HashTable,它也可以被作为参数实例进行传递。
7.4结果映射(ResultMaps)
7.3节介绍了用于数据库查询的参数映射和内联映射,查询结果的映射则由ResultMap完成,它负责把查询结果与对象属性进行映射。理解结果映射是非常重要的,也是通常都需要用到的。Resultmap的目的是让我们能够控制如何从查询结果中获取所需数据,还能够控制查询结果列与对象属性间的映射关系。一个ResultMap可以描述出列的类型,一个空值域,或者包含集合的复合属性。下例给出了
[.....]表示可选项。Id属性是必须项。Class属性也是需要的,可用类型别名或者全名设置它的值。获取结果对象的时候将用这个类进行对象初始化,并与结果集的数据进行映射。resultMap可以包含任意数量的属性映射以便与查询的列进行对应。保持好元素的顺序能够使得变更数据驱动和数据提供者时获得一致的结果。与参数类一样,结果类也必须是一个.NET对象或者IDictionary实例。
7.4.1扩展resultMaps
extens属性是可选的,它的意义同7.2.5.7中的内容。
注:(设A类包含B类的对象属性)在定义文档中,B类必须在扩展resultMap元素A之前定义。A和B可以是不同的类,也不必是相联系的。
7.4.2
7.4.2.1id
略
7.4.2.2class
略
7.4.2.3extends
这个属性使得结果映射操作可以继承已有的resultMap项。7.4.2.4groupBy
该属性是对由resultMap生成的对象结果的属性定义一个列表,这个列表用于唯一标识返回结果节中行。对于在所声明的属性表中相等的行则只产生一个对象。在resultMaps中嵌入groupBy元素可以解决N+1查询问题。例如“id”或者“description,Date”。
7.4.3
7.4.3.1argumentName
返回对象构造函数的参数名称。
7.4.3.2column
查询结果中列的名字。
7.4.3.3columnIndex
columnIndex是一个新加的可选项,用于表征列在查询结果集中列的索引号,这个结果集的数据是与返回对象有映射关系的集合。大概在99%的应用中不需要使用这个属性,因为它是以牺牲代码可维护性和可读性为代价的。请根据需要谨慎对待。
7.4.3.4dbType
这个属性的值用于显示指定查询结果列的数据类型。虽然对于resultMap来说,确定空值是很容易的,但是显示指定列类型在一些特定的类型映射中是很有用的,如Date属性。上文中对此有所叙述,此处从略。
7.4.3.5type
用于说明对象的属性在CLR中的类型。从略。
7.4.3.6resultMapping
resultMapping属性值标识了用另外一个resultMap的对象作参数来向该对象的构造方法传递。它的值就是另一个resultMap的名称(id)。如果resultMap在另外一个映射定义文件中,我们必须提供它的全名(即[命名空间.id])。
7.4.3.7nullValue
nullValue属性的值根据(构造函数的)参数类型的不同,可以使复合其类型的任意值。当在查询结果的映射列中发现null
时,用nullValue属性的值来作为对象属性值传到构造函数中。这就使得我们可以使用我们“规定”的空值来填充那些没有真正null值的数据类型属性,如int,float,double。
7.4.3.8select(略)7.4.3.typeHandler(略)
7.4.4
7.4.4.1property
意义略。注:对象的一个属性可以使用多次,使用次数依赖于所需的映射结果次数。
7.4.4.2column
略
7.4.4.3columnIndex
略
7.4.4.4dbType
略
7.4.4.5type
略
7.4.4.6resultMapping
意义从略。语法和实例代码如下:
7.4.4.7nullValue
意义描述从略。
如果数据库具有空值列,而我们又想在应用程序中用一个常值来替换空值,那么就可以在ResultMap中使用这个属性。举例如下:
在此例中,当PRD_SUB_CODE列中有null值时,product类对象的subCode属性就会被赋值为“-9999”。
7.4.4.8select7.4.4.9lazyLoad7.4.4.10typeHandler
7.4.5CustomTypeHandlers(自定义类型引擎)7.4.6InheritanceMapping继承映射
iBATISDataMapper支持面向对象中的继承机制。实体类和其子类与数据结果的映射有下面几种可选方式:
(1)为每个类设计resultMap
(2)在父类resultMap的元素中使用submap(3)为每个子类使用扩展resultMaps
在使用这种继承映射机制的时候,resultMap必须在查询中定义一列或多列,来用于区分每个结果记录应该和哪个resultMap对应。许多情况下,我们使用一个列的值就可以完成这种区分,这个列被称作“discriminator”——辨别器。
例如,我们在数据库中定义了一个表用来存储Document信息。这个表有5个列——ID,Title,Type,PageNumber,Citie。这个表可能是从别的库中演变而来的,为了在应用程序中使用这个表,我们在实体域中定义了Document的多个子类。在应用程序中,我们需要把一组包含这几种类型的对象数据保存到该表中,那么继承映射机制就会对此进行简化处理。
我们首先有个Document基类,它含有id和Title属性。然后我们设计了继承自Document类的Book、NewPaper类。Book类在Document类的基础上增加了PageNumber属性,Newspaper类在Document类的基础上增加了一个City属性。
如下所示:Documents,Books,andNewspapers!
现在开始编写映射定义。先创建一个
DataMapper根据Document_Type列值的不同会产生不同的对象实例。根据两个
对于区分不同的实体类比较复杂的情况,需要使用用户自定义的类型处理引擎。