做动画网站郑州seo优化顾问热狗
batis配置多表关联(一对一、一对多、多对多)
博客分类:ibatis
ibatis的表关联,和数据库语句无关,是在程序中,把若干语句的结果关联到一起。
这种关联形式,虽然在大数据量时是很奢侈的行为,但是看起来很干净,用起来也很方便。
这里用表lock和key为例,一个lock可以配多个key。
CREATETABLE lock(
id int,
lockName varchar
);
CREATETABLEkey(
id int,
lockId int,
keyName varchar
);
package zzcv.dao.domain;
publicclass Lock
{
privateint id;
private String lockName;
private Object keys; //这里可以存放一个查询结果List。
publicvoid getId(){
return..
...
//省略
}
package zzcv.dao.domain;
publicclass Key
{
privateint id;
privateint lockId;
private String keyName;
private Object lock; //这里可以存放key匹配的lock。
...
//省略
}
<sqlMapnamespace="test">
<typeAliasalias="Key"type="zzcv.dao.domain.Key"/>
<typeAliasalias="Lock"type="zzcv.dao.domain.Lock"/>
<resultMapid="KeyResult"class="Key">
<resultproperty="id"column="id"/>
<resultproperty="keyName"column="keyName"/>
<resultproperty="lock"column="lockId"select="getLockById"/>
</resultMap>
<!-- 通过key表中保存的lock的id实现的一对一关联,ibatis会使用getLockById(lockId)的结果填充lock属性 -->
<resultMapid="LockResult"class="Lock">
<resultproperty="id"column="id"/>
<resultproperty="lockName"column="lockName"/>
<resultproperty="keys"column="id"select="getKeysByLockId"/>
</resultMap>
<!-- 通过lock的id实现的一对多关联,ibatis会使用getKeysByLockId(id)得到的List填充keys属性 -->
<!-- 多对多可以通过嵌套实现,这里就不列出了 -->
<selectid="selectAllkeys"resultMap="KeyResult">
<![CDATA[
select id,lockId,keyName from key
]]>
</select>
<selectid="getLockById"parameterClass="int"resultClass="Lock">
<![CDATA[
select id,lockName from lock where id = #value#
]]>
</select>
<selectid="selectAllLocks"resultMap="LockResult">
<![CDATA[
select id,lockName from lock
]]>
</select>
<selectid="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(); }
catch(IOException e){
thrownew RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);}
List locks=sqlMapper.queryForList("selectAllLocks");
//取一个Lock对象。
Lock lock=(Lock)locks.get(0);
//从Lock对象取List<Key>。
List keys=lock.getKeys();
//示例结束,取到结果了,剩余的一个关联是取对象Lock,其余操作差不多,就不写出了。
...
.
转载于:https://blog.51cto.com/1193452522/1285992