zoukankan      html  css  js  c++  java
  • ibatis一对多 数据库设计及实现

    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,其余操作差不多,就不写出了。
         ...

  • 相关阅读:
    北亚一例服务器硬盘故障的数据恢复案例研究
    Syabse数据库无法启动的解决方案
    raid5 阵列硬盘离线数据恢复成功案例
    MSSQL 2000 错误823恢复案例
    服务器数据恢复案例
    虚拟机数据丢失的数据恢复过程和数据恢复方法
    数据库打开时报错该如何解决
    误删除导致文件系统中的邮件丢失的数据恢复过程
    第16月第25天 tableView设置UITableViewStyleGrouped顶部有空余高度
    第16月第24天 find iconv sublime utf-8
  • 原文地址:https://www.cnblogs.com/wang3680/p/4391618.html
Copyright © 2011-2022 走看看