iBATIS ResultMap基础浅析

来源:互联网 发布:飞鹰网络电视ios 编辑:程序博客网 时间:2024/06/09 08:18


 

 

     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的功能。这时候在程序中使用的是运行时的动态类型所以你没办法进行强类型转换。 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东买的显示器过保坏了怎么办 支付宝充话费充错号码是空号怎么办 京东充话费充错了号码该怎么办 微信红包充话费不到账怎么办 支付宝充话费等待第三方发货怎么办 微信充话费显示成功但没收到怎么办 微信退款一直在退款中怎么办 文件大于100发不了微信怎么办 微信的传送文件大于100怎么办 微信钱包话费充值错误怎么办 微信转账到不了账也退不回是怎么办 求人办事微信发红包对方不收怎么办 微信上交了订金对方不退怎么办 交通事故对方伤员堵大门搂腿怎么办 电脑开机桌面文件都没了怎么办 qq飞车手游队长换了微信群怎么办 qq飞车手游登录授权失败怎么办 安装时提示安装包发现错误怎么办 苹果6p升级系统验证失败怎么办 w10开不了机无限重启怎么办 微信朋友圈里的表情图打不开怎么办 金立手机微信启动录音被拒绝怎么办 微信帐号解封后漂流瓶不能用怎么办 微信怎么在电脑上登不上去怎么办 玩旧版60级魔兽经常花屏怎么办? 我的世界手机版物品栏不见了怎么办 苹果手机掉进水里出现花屏该怎么办 球球大作战还没进去停止运行怎么办 ps3 e3硬破芯片坏了怎么办 电话打开后页面上没有东西怎么办 WPS在电脑安装后卸载不了怎么办 ps总要以管理员的身份打开怎么办 3d关的慢保存慢怎么办 无法与服务器建立可靠的连接怎么办 被抵押的房子开发商不解押怎么办 手机系统语言是英文没有中文怎么办 w7主机网插口灯不亮了没网怎么办 电脑用了5年变得很卡了怎么办 苹果6s系统占12g怎么办 百度网盘下载的压缩包打不开怎么办 三星手机微信安装包解析错误怎么办