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

iBatis的多表关联。

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

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

CREATETABLElock(
     id int,
     lockName varchar
);

CREATETABLEkey(
     id int,
     lockId int,
     keyName varchar
);

定义映射类

packagezzcv.dao.domain;

publicclassLock
{
    privateintid;
    privateString lockName;
    private List<Key> keys = new ArrayList<Key>();
    
    publicvoidgetId(){
        return..
         ...
        //省略
}

packagezzcv.dao.domain;

publicclassKey
{
    privateintid;
    privateString keyName;
    privateLock 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){
        thrownewRuntimeException("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,其余操作差不多,就不写出了。
     ...