ibatis配置多表关联(一对一、一对多、多对多)
iBatis的多表关联。
ibatis的表关联,和数据库语句无关,是在程序中,把若干语句的结果关联到一起。
这种关联形式,虽然在大数据量时是很奢侈的行为,但是看起来很干净,用起来也很方便。
这里用表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" 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" 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" parameterresultresultMap="LockResult"> <![CDATA[ select id,lockName from lock ]]> </select> <select id="getKeyByLockId" parameterresultname="code"> ... .. 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,其余操作差不多,就不写出了。 ... .