iBATIS ResultMap是我们学习iBATIS中非常重要的一个内容,在我个人看来,能否真正用好iBATIS的一个关键,这就是ResultMap。字面上理解,它就是结果集的映射,就是将返回的记录逐个字段的映射赋值给对象的属性上。其实如果没有特殊需求的话我们完全可以使用ResultClass来代替它,因为如果字段与属性一模一样的话,查询出来数据集会自动匹配到ResultClass指定的类的实例对象,如果字段名不在属性中的话,那这个字段将不会被返回的实例体类对象接受,相当于没有查询出这个字段一样的。
每个ResultMap都有一个自己的ID,如果你在sqlmap.config中没有配置使用命名空间的话,那么这个ResulteMap ID是全局(这点在所有的iBATIS配置元素都是一样的),ResultMap一个重要的属性的是class,它将决定这个ResultMap对应的实例的类,换句话讲,它的作用是指出结果集要映射的数据类型。在extends属性中可以设置它将要继承的ResultMap,如果给他指定的了值,那么它将会从super Resultmap继承所的映射配置字段。定义如下:
﹤resultMaps﹥
﹤resultMap id="DemoResultMap" class="Hashtable"﹥
﹤/resultMap﹥
﹤/resultMaps﹥
如果你有正确配置了iBATIS的XSD架构文件的话,那么这时候就会提示resultMap的定义是不完全的。没错,接下来就是要定义Result元素。每一个result元素都是定义一个字段与数据类属性对应的映射。在每一个result元素有比较多的属性参数,其中property和column是必须的,其它的参数属性都是可选的。所以我们在每一个resultMap中必须定义超过一个以上的result定义。通常以下的配置就可以完成基本的配置了。
﹤resultMaps﹥
﹤resultMap id="DemoResultMap" class="Hashtable"﹥
﹤result property="id" column="id"/﹥
﹤/resultMap﹥
﹤/resultMaps﹥
但如果你需要更多的要求的话,result map仍然能够最大限度的满足你。
◆columnIndex属性提供了我们将数据集的第几个下标字段映射到指定的数据对象属性的方案,但是这种方式应该尽量的少用,你会发现这对我们以后的维护和可读性会产生很大的副作用。
◆dbType属性明确指出这个字段对应的数据库的类型,大多数情况我很少会用到。
◆type属性则明确指出这个字段将对应的数据对象属性的数据类型,通常如果你想保证类型安全的话,设置这个属性是很必要的。
◆resultMapping属性则稍微复杂一些,它是用在一种场景下,如果一个数据类的属性本身不是基元数据类型,而是一个复杂数据类型的话,那我们就不可能很简单地给它一个简单的result元素就了事了,还必须给他一个完整的resultMap。而resultMapping属性就是为了完成这个功能而存在的。它的属性值是一个已存在的resultMap的ID。
◆nullValue属性就没什么好讲的了,它是给出当这个字段的值为null的时候,它的默认值是多少。
◆select属性同resultMapping一样比较复杂一样,先说一下它的属性值必须是一个返回数据集合的查询语句的ID,能配置这个属性的数据类属性可以是一个基元类型,复合类型,也可以是一个包括多条数据的集合类型,这些类型都行,没有问题的。它的一处重要的存在意义就在于描述不同表之间的关系问题,通过本次的查询,你想不通过join的手段从另一个表查询相关字段的时候,你就可以使用select属性。如下:
﹤resultMaps﹥
﹤resultMap id="DemoResultMap" class="Hashtable"﹥
﹤result property="id" column="id"/﹥
﹤result property="Children" column="id" select="SELECT_Children"/﹥
﹤/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的基础情况以及问题暂时没有想到更多了,如果以后还有关于iBATIS ResultMap的问题,都会更新上来,也希望大家一起来指正我的一些错误和不足,一起完善。不要让我的一些错误的实践误导了初学者,谢谢。
分享到:
相关推荐
ResultMap是iBatis中的一个重要特性,用于更复杂的数据映射场景。 - 可以用来处理一对多或多对多关系。 - 使用关联查询和其他高级SQL技巧时非常有用。 **Contact.xml示例**: ```xml <resultMap id=...
在`org.apache.ibatis.executor.resultset.ResultSetHandler`中,ResultMap被用来定义字段与Java对象属性的映射关系。ResultMap不仅支持简单的列名映射,还能处理复杂的一对多、一对一关系映射。 六、...
此外,iBATIS还提供了一些辅助工具,如`ParameterMap`用于管理SQL语句的输入参数,`ResultMap`用于处理查询结果的映射,以及`Cache`机制,用于缓存查询结果,提高系统性能。这些工具类使得开发者能够更方便地进行...
6. ResultMap和ResultSetHandler:ResultMap定义了结果集的映射规则,而ResultSetHandler则将数据库查询的结果转换为Java对象。 7. Statement:代表了数据库的SQL语句,包括PreparedStatement(预编译SQL)和...
**IBATIS API 帮助文档与IBATIS开发文档详解** IBATIS,一个由iBATIS公司开发的开源持久层框架,是Java世界中广泛使用的数据访问接口(DAO)工具。它允许开发者将SQL语句直接写在XML配置文件中,实现了SQL与Java...
在IBatis中,ResultMapping的名称需要加上namespace,例如:<resultMap id="xxxMap" class="xxx"> <result property="abc" resultMap="ns.yyyMap"/> </resultMap>。 3. IBatis的配置错误 在配置IBatis时,可能会...
`resultMap`是ibatis中一个重要的概念,用于描述SQL查询结果与Java对象之间的映射关系。通过`resultMap`可以实现复杂的对象关系映射,如一对一、一对多等关联关系。 ### 动态SQL ibatis还支持动态SQL语句,可以...
例如,你可以通过使用`<if>`、`<choose>`等标签来编写条件语句,通过`<resultMap>`来定义复杂的对象关系映射。 学习Ibatis,不仅能够提高开发效率,还能使代码更加清晰、易于维护。随着对Ibatis的深入理解和实践,...
iBatis 是一款轻量级的Java持久层框架,它主要负责将数据库操作与业务逻辑解耦,使得开发者可以更加专注于SQL和业务代码的编写。本文档将详细讲解iBatis的核心概念、快速入门以及高级特性。 ### iBatis 快速启动 #...
4. 结果映射:通过`@ResultMap`注解或`<resultMap>`标签进行结果集映射。 六、IbatisDemo学习要点 1. 理解Ibatis的基本架构和工作原理。 2. 掌握SqlMapConfig.xml的配置,如数据源设置、事务管理等。 3. 学习Mapper...
2. 结果映射:使用 `<resultMap>` 定义结果集映射规则,可以进行复杂的列名和属性名映射,支持关联对象映射。 六、事务管理 Ibatis 支持编程式和声明式两种事务管理方式。编程式事务管理通过 `SqlSession` 的 begin...
5. **结果映射(ResultMap)**:Ibatis的ResultMap用于处理复杂的查询结果,它可以映射多对一、一对多的关系,或者处理自定义类型转换等复杂情况。 6. **动态SQL**:Ibatis的动态SQL功能允许在XML配置文件中编写...
6. **结果映射**:返回的结果可以通过ResultMap进行自动映射到Java对象,或者使用resultType或resultMap指定返回类型。 **iBatis迭代的用法** 在处理查询结果时,iBatis提供了迭代的用法,可以方便地遍历查询结果...
1.4 结果集映射:通过 `<resultMap>` 元素,定义了 SQL 查询结果如何映射到 Java 对象,支持一对一、一对多、多对多等复杂关系映射。 **2. Ibatis 工作原理** 2.1 配置:在启动时,Ibatis 读取配置文件,加载 SQL ...
在映射文件中,使用 `<resultMap>` 定义对象字段与 SQL 列的映射关系。 7. **Mybatis 的优势** - 灵活的 SQL:Ibatis 允许开发者自由编写 SQL,避免了 ORM 框架的过度抽象。 - 事务控制:Ibatis 提供了对事务的...
5. **自动生成select语句**:在标签处,按Alt+Enter选择Generate result for resultMap or resultClass,插件会根据parameterClass或parameterMap自动生成对应的select语句。 6. **SqlMapClient方法调用的代码提示*...
通过定义`<resultMap>`,我们可以指定列名与Java属性的对应关系,甚至处理一对一、一对多、多对多等复杂关系。 4. **事务管理**:iBatis可以方便地进行事务控制,通过SqlSessionFactory和SqlSession对象,我们可以...
`<resultMap>`标签可以处理复杂的一对多、一对一、多对多关系,以及自定义的类型转换。 6. **事务管理**: iBatis支持JDBC和Spring的事务管理方式,通过`transactionManager`配置来决定。在Spring环境下,可以利用...
总的来说,调用Oracle存储过程并在iBATIS中处理Cursor结果集涉及多个步骤,包括定义`parameterMap`、设置正确的`jdbcType`和`javaType`、在`<procedure>`标签中使用正确数量的占位符以及创建`ResultMap`来解析结果。...