ibatisWord文档下载推荐.docx
- 文档编号:3108303
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:16
- 大小:24.13KB
ibatisWord文档下载推荐.docx
《ibatisWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ibatisWord文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
结果集如果采用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
C
15.left
outer
join
PRODUCT
P
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ibatis