首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-09-01 
ibatis配置多表关联(一对一、一对多、多对多)(转载)ibatis的表关联,和数据库语句无关,是在Java程序中,把若干

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

ibatis的表关联,和数据库语句无关,是在Java程序中,把若干语句的结果关联到一起。
这种关联形式,虽然在大数据量时是很奢侈的行为,但是看起来很干净,用起来也很方便。

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

CREATE?TABLE?lock(
???? id?int,
???? lockName?varchar
);

CREATE?TABLE?key(
???? id?int,
???? lockId?int,
???? keyName?varchar
);

定义映射类

package?zzcv.dao.domain;

public?class?Lock
{
????private?int?id;
????private?String lockName;
????private?Object keys;?//这里可以存放一个查询结果List。
????
????public?void?getId(){
????????return..
???????? ...
????????//省略
}

package?zzcv.dao.domain;

public?class?Key
{
????private?int?id;
????private?int?lockId;
????private?String keyName;
????private?Object lock;?//这里可以存放key匹配的lock。
???????? ...
????????//省略
}

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

<sqlMap?namespace="test">???
??<typeAlias?alias="Key"?type="zzcv.dao.domain.Key"/>???
??<typeAlias?alias="Lock"?type="zzcv.dao.domain.Lock"/>???
????
??<resultMap?id="KeyResult"?class="Key">???
??<result?property="id"?column="id"/>???
??<result?property="keyName"?column="keyName"/>???
??<result?property="lock"?column="lockId"?select="getLockById"/>???
??</resultMap>
??<!--?通过key表中保存的lock的id实现的一对一关联,ibatis会使用getLockById(lockId)的结果填充lock属性?-->
????
??<resultMap?id="LockResult"?class="Lock">???
??<result?property="id"?column="id"/>???
??<result?property="lockName"?column="lockName"/>???
??<result?property="keys"?column="id"?select="getKeysByLockId"/>???
??</resultMap>
??<!--?通过lock的id实现的一对多关联,ibatis会使用getKeysByLockId(id)得到的List填充keys属性?-->
??
??<!--?多对多可以通过嵌套实现,这里就不列出了?-->
??
??<select?id="selectAllkeys"?resultMap="KeyResult">???
??<![CDATA[???
?? select id,lockId,keyName from key
??]]>???
??</select>???
????
??<select?id="getLockById"?parameterClass="int"?resultClass="Lock">???
??<![CDATA[???
?? select id,lockName from lock where id = #value#???
??]]>???
??</select>
??
??<select?id="selectAllLocks"?resultMap="LockResult">???
??<![CDATA[???
?? select id,lockName from lock
??]]>???
??</select>???
????
??<select?id="getKeyByLockId"?parameterClass="int"?resultClass="key">???
??<![CDATA[???
?? select id,lockId,keyName from lock where lockId = #value#???
??]]>???
??</select>
</sqlMap>???

现在可以代码中使用了

???? ...
???? ..
????try{
???????? Reader reader = Resources.getResourceAsReader("mxd/dao/data/SqlMapConfig.xml");
???????? sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
???????? reader.close(); }
? ??

?

热点排行