您的位置:首页 > 数据库

ibatis一对多 数据库设计及实现

2015-04-04 09:42 309 查看
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 List<Key> keys = new ArrayList<Key>();

public void getId(){
return..
...
//省略
}

package zzcv.dao.domain;

public class Key
{
private int id;
private String keyName;
private Lock 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(); }
catch(IOException e){
throw new 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,其余操作差不多,就不写出了。
...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: