batis配置多表关联(一对一、一对多、多对多)

    博客分类:
  • ibatis

iBATIS DAO SQL XML
iBatis的多表关联。

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

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

Sql代码  
  1. CREATETABLE lock(  

  2.    id int,  

  3.    lockName varchar

  4. );  

  5. CREATETABLEkey(  

  6.    id int,  

  7.    lockId int,  

  8.    keyName varchar

  9. );  

定义映射类

Java代码  
  1. package zzcv.dao.domain;  

  2. publicclass Lock  

  3. {  

  4. privateint id;  

  5. private String lockName;  

  6. private Object keys; //这里可以存放一个查询结果List。

  7. publicvoid getId(){  

  8. return..  

  9.        ...  

  10. //省略

  11. }  

  12. package zzcv.dao.domain;  

  13. publicclass Key  

  14. {  

  15. privateint id;  

  16. privateint lockId;  

  17. private String keyName;  

  18. private Object lock; //这里可以存放key匹配的lock。

  19.        ...  

  20. //省略

  21. }  

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

Xml代码  
  1. <sqlMapnamespace="test">

  2. <typeAliasalias="Key"type="zzcv.dao.domain.Key"/>

  3. <typeAliasalias="Lock"type="zzcv.dao.domain.Lock"/>

  4. <resultMapid="KeyResult"class="Key">

  5. <resultproperty="id"column="id"/>

  6. <resultproperty="keyName"column="keyName"/>

  7. <resultproperty="lock"column="lockId"select="getLockById"/>

  8. resultMap>

  9. <resultMapid="LockResult"class="Lock">

  10. <resultproperty="id"column="id"/>

  11. <resultproperty="lockName"column="lockName"/>

  12. <resultproperty="keys"column="id"select="getKeysByLockId"/>

  13. resultMap>

  14. <selectid="selectAllkeys"resultMap="KeyResult">

  15.  select id,lockId,keyName from key

  16.  ]]>

  17. select>

  18. <selectid="getLockById"parameterClass="int"resultClass="Lock">

  19.  select id,lockName from lock where id = #value#  

  20.  ]]>

  21. select>

  22. <selectid="selectAllLocks"resultMap="LockResult">

  23.  select id,lockName from lock

  24.  ]]>

  25. select>

  26. <selectid="getKeyByLockId"parameterClass="int"resultClass="key">

  27.  select id,lockId,keyName from lock where lockId = #value#  

  28.  ]]>

  29. select>

  30. sqlMap>


现在可以代码中使用了

   ...
   ..
Java代码  
  1. try{  

  2.        Reader reader = Resources.getResourceAsReader("mxd/dao/data/SqlMapConfig.xml");  

  3.        sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);  

  4.        reader.close(); }  

  5. catch(IOException e){  

  6. thrownew RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);}  

  7.    List locks=sqlMapper.queryForList("selectAllLocks");  

  8. //取一个Lock对象。

  9.    Lock lock=(Lock)locks.get(0);  

  10. //从Lock对象取List

  11.    List keys=lock.getKeys();  

  12. //示例结束,取到结果了,剩余的一个关联是取对象Lock,其余操作差不多,就不写出了。

  13.    ...  

  14.    .