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

  • 相关阅读:
    在响应式项目中连接设计与开发
    社交APP的痛点及九大流派解析,微信陌陌,咱还约吗
    网传奶茶妹将进入红杉资本
    OLE、OCX和ActiveX控件之间的比较
    Unity3D网络游戏实战(第2版)
    离婚?在Facebook上把已婚状态改为单身就可以!
    同样酷炫但却失败了的谷歌眼镜,能否给Apple Watch一些前车之鉴?
    Apple Watch首批评测放出:有吐槽、有体贴……毒哭了,暖哭了
    如何培养战略领导力,赢得“长久游戏”?
    博客社交已死,数据社交“永生”
  • 原文地址:https://www.cnblogs.com/wang3680/p/4391618.html
Copyright © 2020-2023  润新知