本文向您展示了如何分析iBATIS结果图的基础。内容简洁易懂,一定会让你大放异彩。希望通过这篇文章的详细介绍,你能有所收获。
iBATIS结果图是我们研究IBATIS的一个非常重要的内容。就个人而言,善用ibatis的关键之一是ResultMap。从字面上看,它是结果集的映射,也就是说,返回的记录逐字段的映射被分配给对象的属性。事实上,如果没有特殊要求,我们可以用ResultClass代替它,因为如果字段与属性完全相同,查询到的数据集会自动匹配ResultClass指定的类的实例对象,如果字段名称不在属性中,那么这个字段就不会被返回的实例对象接受,相当于没有找出相同的字段。
每个结果映射都有自己的标识。如果没有在sqlmap.config中配置命名空间,那么这个ResulteMap ID是全局的(这在所有iBATIS配置元素中都是一样的),ResultMap的一个重要属性是class,它将决定这个ResultMap对应的实例的类。换句话说,它用于指示结果集要映射的数据类型。在extends属性中,您可以设置它将继承的ResultMap。如果为他指定了一个值,它将从超级Resultmap继承映射配置字段。定义如下:
(结果映射) (结果映射id=' demoresultmap ' class=' hashtable ')(/结果映射)(结果映射)如果正确配置了带有iBATIS的XSD模式文件,此时将会提示您。是的,下一步是定义结果元素。每个结果元素定义了字段和数据类属性之间的映射。每个结果元素中有许多属性参数,其中属性和列是必需的,其他参数和属性是可选的。因此,我们必须在每个结果映射中定义多个结果定义。以下配置可以完成基本配置。
& lt结果图<。& lt结果映射id=' demoresultmap ' class=' hashtable ' & gt;& lt结果属性=' id '列=' id '/& lt;结果图>
columnIndex属性为我们提供了一个将数据集的下标字段映射到指定的数据对象属性的方案,但是这个方法要尽量少用,你会发现对我们以后的维护和可读性会有很大的副作用。
dbType属性明确表示这个字段对应的数据库类型,我在大多数情况下很少使用。
类型属性明确表示该字段对应的数据对象属性的数据类型。通常,如果要确保类型安全,需要设置此属性。
结果映射属性稍微复杂一点。它用在场景中。如果一个数据类的属性是一个复杂的数据类型而不是基元数据类型,那么我们就不能简单地给它一个简单的结果元素,还必须给它一个完整的resultMap。存在结果映射属性来完成此功能。它的属性值是现有结果映射的标识。
nullValue属性没什么好说的。当该字段的值为空时,它给出该字段的默认值。
选择属性和结果映射一样复杂。首先,它的属性值必须是返回数据集的查询语句的ID。可以配置此属性的数据类属性可以是基元类型、复合类型或包含多条数据的集合类型。所有这些类型都可以,没有问题。它的一个重要意义在于join描述了不同表之间的关系。通过此查询,当您想要在不连接的情况下从另一个表中查询相关字段时,可以使用select属性。如下所示:
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
bsp; ﹤/resultMap﹥ ﹤/resultMaps﹥ ﹤statements﹥ ﹤select id="SELECT_Children" resultClass="ChildrenObject"﹥ SELECT * FROM Children WHERE ParentID = #id# ﹤/select﹥ ﹤/statements﹥
这样就可以做到不用通过编程的方式来表示不同表的关联关系和数据读取问题。但是这样有可能存在一种问题,如果你每次都要读取数据的时候,你会发现你会产生更多次的与数据库交互的情况,并且即使你不是每次都需要这数据,那会不会造成数据读取的浪费呢?接下来的lazyLoad属性就为我们提供了第二种问题的解决方案了,那就是数据的延迟加载,没错,延迟加载可以大大改善数据访问的性能,它只是要需的时候才去读取这些数据,对于主从表关系的时候,这样的方式可能是***的解决方式了。
OK,关于ResultMap的介绍就先到此为止,接下来我要记录一下,我在使用过程中遇到的一些问题:
一.在使用ResultMap的时候,你要特别注意,如果你在ResultMap中给出的配置字段,但是你返回的数据集的时候却没有返回这个字段,那程序将出抛出异常。但是相反的,如果你返回了一些字段,却没有在ResultMap给出配置定义的话,那么那些字段将不会被处理而不会给你任何的提示,相当没有查询出这些字段。你要特别注意这个问题。
二.如果没有特别需求的情况,我建议还是把数据类的属性设计成与数据库字段字一样的比较,这样如果一般情况下我们都可以不用写这个ResultMap,事实上如果没有这样的特殊要求,那么去写这个ResultMap仍然是一件非常耗时,并且容易出错的一份差事。
三.在使用lazyLoad的时候要特别注意,不是什么类型的数据都可以lazyLoad的,只有是实现的IList的接口的类型,并且数据类的属性定义为IList类型的字段才能被lazyLoad。(关于是否只有IList类型的属性才能被lazyLoad的问题还需要探讨一下,因为就我使用的经验只有这种类型才可以,甚至是Generic版的IList都不支持)。而且你在使用它的时候,还不能把这个IList类型的属性转换成你真正的数据类型。因为在运行时,这个属性会被包装成一个动态的类型,这个动态类型仍然实现了IList接口,就是因为这个动态类型才扩展了我们可以lazyLoad的功能。这时候在程序中使用的是运行时的动态类型所以你没办法进行强类型转换。
上述内容就是如何进行iBATIS ResultMap基础的浅析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/152041.html