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,其余操作差不多,就不写出了。
...
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,其余操作差不多,就不写出了。
...
相关文章推荐
- iBATIS的多对多 数据库设计及实现
- 数据库访问层设计与实现(2)
- 记帐系统从需求到实现 ----数据库的设计
- 数据库分表处理设计思想和实现
- 基于角色的访问控制'的权限管理的数据库的设计实现
- 无限级分类设计--纯数据库实现
- 统一身份认证子系统数据库设计与数据访问层实现
- 2009-03-20技术学习:Wicket+iBATIS 实现树控件的数据库绑定
- 关于抽象工厂实现数据库查询的设计(JAVA代码实现)
- IBatis设计实现的功能(1)
- 数据库字段设计实现无限级分类
- .:::::利用Delphi实现两层C/S数据库应用程序设计简介 :::::.
- 基于日志结构的嵌入式数据库设计和实现1
- 一步一步实现数据库到类的自动化映射(一) 类层次的设计 概述
- 利用Delphi实现两层C/S数据库应用程序设计
- 简易论坛后台数据库设计及实现
- 重新设计NBearV3中的实体关联设计语言,实现数据库完整性约束和级联更新
- 一步一步实现数据库到类的自动化映射(二) 类层次的设计 类的实现
- 数据库设计与实现(1)
- 晒晒我的无限级分类设计--纯数据库实现