`

iBATIS ResultMap基础浅析

 
阅读更多

 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﹥  

[/pre] 

如果你有正确配置了ibatisxsd架构文件的话,那么这时候就会提示resultmap的定义是不

完全的。没错,接下来就是要定义result元素。每一个result元素都是定义一个字段与数据

类属性对应的映射。在每一个result元素有比较多的属性参数,其中propertycolumn

必须的,其它的参数属性都是可选的。所以我们在每一个resultmap中必须定义超过一个以

上的result定义。通常以下的配置就可以完成基本的配置了。 

 

 

resultmaps﹥   

 ﹤resultmap id="demoresultmap" class="hashtable"﹥   

result property="id" column="id"/﹥   

 ﹤/resultmap﹥   

/resultmaps﹥  

[/pre] 

但如果你需要更多的要求的话,result map仍然能够最大限度的满足你。 

◆columnindex属性提供了我们将数据集的第几个下标字段映射到指定的数据对象属性的方

案,但是这种方式应该尽量的少用,你会发现这对我们以后的维护和可读性会产生很大的副

作用。 

◆dbtype属性明确指出这个字段对应的数据库的类型,大多数情况我很少会用到。 

◆type属性则明确指出这个字段将对应的数据对象属性的数据类型,通常如果你想保证类型

安全的话,设置这个属性是很必要的。 

◆resultmapping属性则稍微复杂一些,它是用在一种场景下,如果一个数据类的属性本身不

是基元数据类型,而是一个复杂数据类型的话,那我们就不可能很简单地给它一个简单的

result元素就了事了,还必须给他一个完整的resultmap。而resultmapping属性就是为了完成这个功能而存在的。它的属性值是一个已存在的resultmapid。 

◆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﹥  

[/pre] 

这样就可以做到不用通过编程的方式来表示不同表的关联关系和数据读取问题。但是这样有

可能存在一种问题,如果你每次都要读取数据的时候,你会发现你会产生更多次的与数据库

交互的情况,并且即使你不是每次都需要这数据,那会不会造成数据读取的浪费呢?接下来

lazyload属性就为我们提供了第二种问题的解决方案了,那就是数据的延迟加载,没错,

延迟加载可以大大改善数据访问的性能,它只是要需的时候才去读取这些数据,对于主从表

关系的时候,这样的方式可能是最好的解决方式了。 

ok,关于resultmap的介绍就先到此为止,接下来我要记录一下,我在使用过程中遇到的一

些问题: 

一.在使用resultmap的时候,你要特别注意,如果你在resultmap中给出的配置字段,但是

你返回的数据集的时候却没有返回这个字段,那程序将出抛出异常。但是相反的,如果你返

回了一些字段,却没有在resultmap给出配置定义的话,那么那些字段将不会被处理而不会

给你任何的提示,相当没有查询出这些字段。你要特别注意这个问题。 

二.如果没有特别需求的情况,我建议还是把数据类的属性设计成与数据库字段字一样的比

较,这样如果一般情况下我们都可以不用写这个resultmap,事实上如果没有这样的特殊要

求,那么去写这个resultmap仍然是一件非常耗时,并且容易出错的一份差事。 

三.在使用lazyload的时候要特别注意,不是什么类型的数据都可以lazyload的,只有是实

现的ilist的接口的类型,并且数据类的属性定义为ilist类型的字段才能被lazyload。(关于

是否只有ilist类型的属性才能被lazyload的问题还需要探讨一下,因为就我使用的经验只有

这种类型才可以,甚至是generic版的ilist都不支持)。而且你在使用它的时候,还不能把这

ilist类型的属性转换成你真正的数据类型。因为在运行时,这个属性会被包装成一个动态

的类型,这个动态类型仍然实现了ilist接口,就是因为这个动态类型才扩展了我们可以

lazyload的功能。这时候在程序中使用的是运行时的动态类型所以你没办法进行强类型转换。 

分享到:
评论

相关推荐

    C# IBatis IBatis基础 完整项目

    【标题】:“C# IBatis IBatis基础 完整项目” 【描述】中提到的是一个基于C#的IBatis学习项目,适用于初学者。IBatis是一个流行的数据访问层框架,它允许开发者将SQL语句与应用程序代码分离,提高了代码的可维护性...

    iBATIS-基础入门资料

    本资料集是针对iBATIS的基础入门教程,适合初学者了解和学习。 在iBATIS中,核心概念包括SQL Maps和Data Access Objects(DAOs)。SQL Maps是XML配置文件,其中包含了与数据库交互的SQL语句,而DAOs则是Java接口,...

    Ibatis 框架基础

    《Ibatis 框架基础详解》 Ibatis,作为一个轻量级的持久层框架,以其灵活、简单的特点在Java开发领域中广受欢迎。本文将深入解析Ibatis的基本概念、核心功能以及使用方法,帮助开发者更好地理解和应用这一框架。 ...

    ibatis常用基础知识

    【ibatis基础知识详解】 Ibatis,作为一个开源的Java持久层框架,主要目的是简化数据库操作,减少繁琐的JDBC代码编写。它将SQL语句与Java代码分离,使得开发者可以更专注于业务逻辑,而不必过于关心数据访问细节。...

    关于ibatis的基础教程

    **Ibatis基础教程** Ibatis,全称MyBatis,是一个优秀的开源Java持久层框架,它专注于SQL映射,使得开发者能够将精力集中在编写SQL上,而无需关注JDBC的繁琐工作。Ibatis的主要目标是简化Java应用与数据库之间的...

    ibatis基础教学文档

    iBATIS 是一个Java开发中的持久化框架,由Clinton Begin创建,现由Apache基金会支持。它主要用于简化JDBC编程,提供一种“半...学习和理解iBATIS的基础知识,可以帮助开发者更高效地构建和维护数据驱动的应用程序。

    ibatis基础知识详解

    **Ibatis基础知识详解** Ibatis,全称MyBatis,是一个优秀的开源持久层框架,它支持定制化SQL、存储过程以及高级映射。在Java应用中,Ibatis可以帮助开发者将数据库操作与业务逻辑分离,从而简化开发工作,提高代码...

    iBATIS教程之快速入门浅析

    iBATIS 是一款轻量级的Java持久层框架,它主要负责对象关系映射(Object-Relational Mapping,简称O/R Mapping),使得开发者可以将关注点集中在业务逻辑上,而无需过多地处理数据库操作的细节。与Hibernate等其他...

    ibatis开发指南与入门基础教程.rar

    ibatis开发指南 ibatis入门基础教程 ibatisibatis开发指南 ibatis入门基础教程 ibatisibatis开发指南 ibatis入门基础教程 ibatisibatis开发指南 ibatis入门基础教程 ibatis

    iBATIS教程之入门浅析借鉴.pdf

    iBATIS的配置文件是SQL Map实现的基础,通常是一个XML文件,包含了属性设置、JDBC数据源以及SQL Maps的配置。配置文件可以集中管理不同的数据源,支持iBATIS SimpleDataSource、Jakarta DBCP等。例如,使用Jakarta ...

    ibatis源码,ibatis源码 ibatis源码 ibatis源码

    在`org.apache.ibatis.executor.resultset.ResultSetHandler`中,ResultMap被用来定义字段与Java对象属性的映射关系。ResultMap不仅支持简单的列名映射,还能处理复杂的一对多、一对一关系映射。 六、...

    ibatis api 帮助文档+IBATIS 开发文档

    `ibatis-api.chm`是IBATIS的API帮助文档,它包含了所有核心类和接口的详细说明,是理解和使用IBATIS的基础。以下是一些主要组件和概念: 1. **SqlMapClient**:这是整个IBATIS框架的核心,负责管理所有的SQL映射...

    ibatis基础项目

    【Ibatis基础项目】是一个旨在帮助开发者熟悉IBM开源的轻量级持久层框架Ibatis的实践项目。这个项目的核心目标是让开发者了解如何在实际开发环境中配置和使用Ibatis,以便进行数据库操作。通过这个小型项目,我们...

    iBATIS-DAO-2.3.4.726.rar_com.ibatis.dao_iBATIS dao 2_iBatis DAO_

    此外,iBATIS还提供了一些辅助工具,如`ParameterMap`用于管理SQL语句的输入参数,`ResultMap`用于处理查询结果的映射,以及`Cache`机制,用于缓存查询结果,提高系统性能。这些工具类使得开发者能够更方便地进行...

    iBatis文档\ibatis.doc

    #### 构建 iBatis 基础代码 创建一个`SqlMapConfig.xml`配置文件,其中包含了数据库连接信息、SqlMapClient的配置以及数据源设置。此外,你还需要为每个数据库操作创建单独的XML文件(例如:`User.xml`),这些文件...

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...

    ibatis api,ibatis文档,ibatis说明文档

    6. ResultMap和ResultSetHandler:ResultMap定义了结果集的映射规则,而ResultSetHandler则将数据库查询的结果转换为Java对象。 7. Statement:代表了数据库的SQL语句,包括PreparedStatement(预编译SQL)和...

    Ibatis 入门经典 实例

    1. Mybatis-Plus:在 Ibatis 基础上提供了更多的扩展功能,如 CRUD 操作、条件构造器等。 2. Mybatis Generator:自动化代码生成工具,自动生成 Entity、Mapper 和 XML 文件,提高开发效率。 通过以上内容,你将对 ...

    ibatis教程 输入参数详解

    标题:ibatis教程 输入参数详解 描述:ibatis教程 输入参数详解 ibatis快速入门 ...通过上述知识点的学习,可以深入理解ibatis的工作原理,掌握ibatis的基本使用方法,为开发高性能的Java数据库应用打下坚实的基础。

Global site tag (gtag.js) - Google Analytics