zoukankan      html  css  js  c++  java
  • 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" 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,其余操作差不多,就不写出了。
        ...
        .
  • 相关阅读:
    DML数据操作语言练习
    表的操作练习
    20151218--地区导航习题
    20151217--Ajax的一点补充
    02151216--Ajax
    json(转)
    Node.js(转) -- 临时来说还看不懂!
    20151113--JSTL
    20151210--MVC
    链表(转)
  • 原文地址:https://www.cnblogs.com/wzh123/p/3433443.html
Copyright © 2011-2022 走看看