ibatisWord文档下载推荐.docx

上传人:b****2 文档编号:3108303 上传时间:2023-05-01 格式:DOCX 页数:16 大小:24.13KB
下载 相关 举报
ibatisWord文档下载推荐.docx_第1页
第1页 / 共16页
ibatisWord文档下载推荐.docx_第2页
第2页 / 共16页
ibatisWord文档下载推荐.docx_第3页
第3页 / 共16页
ibatisWord文档下载推荐.docx_第4页
第4页 / 共16页
ibatisWord文档下载推荐.docx_第5页
第5页 / 共16页
ibatisWord文档下载推荐.docx_第6页
第6页 / 共16页
ibatisWord文档下载推荐.docx_第7页
第7页 / 共16页
ibatisWord文档下载推荐.docx_第8页
第8页 / 共16页
ibatisWord文档下载推荐.docx_第9页
第9页 / 共16页
ibatisWord文档下载推荐.docx_第10页
第10页 / 共16页
ibatisWord文档下载推荐.docx_第11页
第11页 / 共16页
ibatisWord文档下载推荐.docx_第12页
第12页 / 共16页
ibatisWord文档下载推荐.docx_第13页
第13页 / 共16页
ibatisWord文档下载推荐.docx_第14页
第14页 / 共16页
ibatisWord文档下载推荐.docx_第15页
第15页 / 共16页
ibatisWord文档下载推荐.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ibatisWord文档下载推荐.docx

《ibatisWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ibatisWord文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。

ibatisWord文档下载推荐.docx

结果集如果采用java.util.Map来包装,那么请为javaType指定明确的数据类型来生成"

关系.Ibatis编程指南上有一节讲述"

复杂类型集合的属性"

其中提到:

让SQLMap架构装入复杂类型集合(List)的业务对象的属性必须是java.util.List或java.util.Collection

如果不为javaType指定数据集合的数据类型,那么sqlmap执行的是queryForObject(),接着就是"

toomuchobjectsforresult"

的异常抛出

hibernate的强大在于完全的对象化,对于对象之间的关系解决的比较好,如1对1,1对多,多对1,以及多对多。

当然也包括继承关系。

 

而ibatis这方面就比较逊色了,不过对于也支持简单的关连查询,如1对1,和1对多。

对于一般的情况来说,这两种已经足够了,当然不能层叠更新是一个缺陷,看了半天文档,也没有找到对象之间的层叠更新,估计是不支持。

以前的版本ibatis处理关连是通过执行两次sql来实现的,如下的实例:

一对多关联:

xml代码

1. 

2.<

sqlMap 

namespace="

User"

3.<

typeAlias 

alias="

user"

type="

com.ibatis.sample.User"

4.<

address"

com.ibatis.sample.Address"

5.<

resultMap 

id="

get-user-result"

class="

6.<

result 

property="

id"

7.<

name"

8.<

sex"

9.<

addresses"

User.getAddressByUserId"

10.<

11.<

select 

getUsers"

parameterClass="

java.lang.String"

resultMap="

12.<

!

[CDATA[ 

13.select 

id,name,sex 

14.from 

t_user 

15.where 

id 

#id# 

16.]]>

17.<

18.<

getAddressByUserId"

resultClass="

19.<

20.select 

address,zipcode 

21.from 

t_address 

22.where 

user_id 

#userid# 

23.]]>

24.<

25.<

/sqlMap>

这里通过在resultMap中定义嵌套查询getAddressByUserId,我们实现了关联数据的读取。

需要注意的是,这里有一个潜在的性能问题,也就是所谓“n+1”Select问题。

一对一关联:

对于这种情况,我们可以采用一次Select两张表的方式,避免这样的性能开销(假设上面示例中,每个User只有一个对应的Address记录):

t_address.address"

zipCode"

t_address.zipcode"

11.select 

12.from 

t_user,t_address 

13.where 

t_user.id=t_address.user_id 

14.]]>

15.<

16. 

在现在的版本中,对于n+1问题,ibatis已经很好的解决了。

如下的配置:

一对一

id=”get-product-result” 

class=”com.ibatis.example.Product”>

property=”id” 

column=”PRD_ID”/>

property=”description” 

column=”PRD_DESCRIPTION”/>

property=”category” 

resultMap=“get-category-result” 

id=”get-category-result” 

class=”com.ibatis.example.Category”>

column=”CAT_ID” 

column=”CAT_DESCRIPTION” 

id=”getProduct” 

parameterClass=”int” 

resultMap=”get-product-result”>

12.select 

13.from 

PRODUCT, 

CATEGORY 

14.where 

PRD_CAT_ID=CAT_ID 

15.and 

PRD_ID 

#value# 

16.<

可以使用内在的resultMap来解决此问题。

同样一对多如下:

ProductCategory"

id=”categoryResult” 

class=”com.ibatis.example.Category” 

groupBy=”id”>

column=”CAT_ID”/>

column=”CAT_DESCRIPTION”/>

property=”productList” 

resultMap=”ProductCategory.productResult”/>

id=”productResult” 

id=”getCategory” 

resultMap=”categoryResult”>

C.CAT_ID, 

C.CAT_DESCRIPTION, 

P.PRD_ID, 

P.PRD_DESCRIPTION 

15.left 

outer 

join 

PRODUCT 

16.on 

C.CAT_ID 

P.PRD_CAT_ID 

17.where 

CAT_ID 

注意,需要使用增加groupBy属性来分类

iBATIS一对多映射之中继VO如下属性:

1.public 

class 

RelayInfoVO 

2. 

//中继信息 

3. 

private 

String 

bswitcherNames;

//本端局 

4. 

dswitcherNames;

//对端局 

5. 

signalStatCount;

//信令数 

6. 

relayStatCount;

//中继数 

7. 

List 

signalVO;

//信令List,用来存放信令List的 

8. 

 

9. 

…… 

iBATIS一对多映射信令VO如下属性:

SignalInfoVO 

//信令信息 

bswitchers;

dswitchers;

signalType;

//信令类型 

signalCount;

//信令个数 

iBATIS的XML如下配置:

注:

为中继

VO,column="

{bswitcherNames=bswitcherName,dswitcherNames=DSWITCHERNAME}"

是为select="

getSignalInfo"

所传递的参数。

为所要调用的SELECT查询语句。

1.﹤resultMap 

RelayInfoVO-Result-list"

com.harvest.ermis.rscount.domain.RelayInfoVO"

﹥ 

﹤result 

bswitcherNames"

BSWITCHERNAME"

nullValue="

"

/﹥ 

dswitcherNames"

DSWITCHERNAME"

signalStatCount"

SIGNALSTATCOUNT"

relayStatCount"

RELAYSTATCOUNT"

signalVO"

7.﹤/resultMap﹥ 

为信令VO

SignalInfoVO-Result-list"

com.harvest.ermis.rscount.domain.SignalInfoVO"

bswitchers"

BSWITCHERS"

dswitchers"

DSWITCHERS"

signalType"

SIGNALTYPE"

signalCount"

SIGCOUTN"

6.﹤/resultMap﹥ 

10.﹤select 

getRSInfo"

11. 

12. 

13. 

14.﹤/select﹥ 

15. 

17.elect 

18. 

c.switcherName 

as 

BSWITCHERS,b.switcherName 

DSWITCHERS,linkType 

SIGNALTYPE,count(*) 

SIGCOUTN 

19. 

where 

20. 

c.switcherName=#bswitcherNames# 

21. 

and 

b.switcherName=#dswitcherNames# 

22. 

group 

by 

b.switcherName,b.ATTACHING,c.switcherName,linktype 

23. 

order 

c.switcherName,b.SWITCHERORDER,linktype 

24.﹤/select﹥ 

背景:

一个存在多对一的映射的表结构,比如视频和视频上传者,目前想取出最受欢迎的视频并要求显示视频的上传者的名字,传统的做法往往会存在n+1问题,对性能有些影响

在IBatis中如何做?

马上进入实战

配置文件如下:

?

xmlversion="

1.0"

encoding="

UTF-8"

DOCTYPEsqlMapPUBLIC"

-//iBATIS.com//DTDSQLMap2.0//EN"

sqlMapnamespace="

specialtopic"

.................................

<

top-Video-column1"

moxtv.central.po.Video"

videoId"

/>

title"

timeSpan"

user.loginName"

loginName"

videoReport.viewedCount"

viewedCount"

statementid="

getTopVideoListByColumn1"

cacheModel="

getTopVideoListByColumn1-cache"

selectv.videoId,v.title,v.timeSpan,tu.loginName,vr.viewedCount

fromtop_baby_videotbv

innerjoinvideovontbv.videoId=v.videoId

innerjoinvideo_reportvronv.videoId=vr.videoId 

innerjointvUsertuonv.tvUserId=tu.tvUserId

/statement>

............................

我们采用多表关联的方式用一个sql取出所有数据,然后定义我们映射规则(见上面的resultMap段),从规则中可以看出,我们将从查出来的loginName列映射到video中复杂属性user的loginName属性.这样的话,一句sql就把所需要的video对象完整加载了,避免了n+1问题.

resultMap是一个非常好的咚咚,比起hibernate它或许多余,但却给了你更大的自由,来配置关系和对象之间的映射规则.而且也无需担心在使用hibernate2中多对一自动加载

ibatis配置多表关联(一对一、一对多、多对多)(转)

iBatis的多表关联。

ibatis的表关联,和数据库语句无关,是在Java程序中,把若干语句的结果关联到一起。

这种关联形式,虽然在大数据量时是很奢侈的行为,但是看起来很干净,用起来也很方便。

这里用表lock和key为例,一个lock可以配多个key。

CREATE 

TABLE 

lock(

int,

lockName 

varchar

);

key(

lockId 

keyName 

定义映射类

package 

zzcv.dao.domain;

public 

Lock

{

int 

id;

lockName;

Object 

keys;

//这里可以存放一个查询结果List。

void 

getId(){

return..

...

//省略

}

Key

lockId;

keyName;

lock;

//这里可以存放key匹配的lock。

}表关联通过配置文件的resultMap实现,不需要关联的查询仍可用resultClass

test"

Key"

zzcv.dao.domain.Key"

Lock"

zzcv.dao.domain.Lock"

KeyResult"

keyName"

lock"

lockId"

getLockById"

-- 

通过key表中保存的lock的id实现的一对一关联,ibatis会使用getLockById(lockId)的结果填充lock属性 

-->

LockResult"

res

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2