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

ibatis一对多 数据库设计及实现的更多相关文章

  1. iBATIS的多对多 数据库设计及实现

    iBATIS的多对多映射配置方法和多对一映射配置方法差不多,不同的是,多对多映射,数据库设计上需要一个记录两个类关系的中间表,本文以学生-老师为例,在iBATIS的sqlmap中配置多对多关系. iB ...

  2. day39 python 学习 数据库学习 五个约束,数据库设计(一对一,一对多等等)

    删除重复数据:  注意数据库不能又查又删 *******#删除作者为重复数据并保留ID最大的是数据 delete from ren where author in (select * from(sel ...

  3. 第二天ci项目规划 数据库设计

    第二天ci项目规划 数据库设计 商品 + 用户 + 订单 数据库设计思想和方法 关于商品品牌 ,分类 ,属性 如何表示 用一个字段 还是再设计一张表 品牌和商品 是一种信息 还是两种信息 一张表一般只 ...

  4. 优化MySchool数据库设计之【巅峰对决】

    优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识 ...

  5. 优化MySchool数据库设计总结

    数据库的设计   一:什么是数据库设计? 数据库设计就是将数据库中的数据实体以及这些数据实体之间的关系,进行规范和结构化的过程. 二:为什么要实施数据库设计? 1:良好的数据库设计可以有效的解决数据冗 ...

  6. MySQL 性能优化 30个数据库设计的最佳实践

    数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程. ...

  7. 数据库设计与 ER 模型 - 数据库系统原理

    数据库系统生存周期 数据库应用系统的开发是一项软件工程,一般具有信息的采集.组织.加工.抽取.综合.传播等功能,但又有自己的特点,所以称为 数据库工程. 数据库应用系统从开始规划.设计.实现.维护到最 ...

  8. 水果项目第1集-想法>需求->功能->数据库设计->类设计

    懒,懒人,我是个懒人. 懒人想做点事,总是拖拖拉拉,迟迟没有开始. 很久很久以前,就想做属于自己的产品,但是至今还没有一个属于自己的产品. 两年前,终于想好,要做一个网上卖水果的系统,手机上点点,水果 ...

  9. S2--《优化MySchool数据库设计》总结

    第一章    数据库的设计 1.1  数据库设计 数据库中创建的数据库结构的种类,以及在数据实体之间建立的复杂关系是决定数据库系统效率的重要因素. 糟糕的数据库设计表现在以下两个方面: *效率低下 * ...

随机推荐

  1. 微信支付WxpayAPI_php_v3(二)支付功能开发

    这里我没有开发openid和acessToken的获取,需要的请参考文档获取. 在阅读本教程之前请熟读微信支付的开发者文档. 直接开始[统一下单],在实际开发的项目中一般都有mvc分层的开发思想. 根 ...

  2. JavaScript CSS Style属性对照表

    JavaScript CSS Style属性对照表 盒子标签和属性对照 CSS语法 (不区分大小写) JavaScript语法 (区分大小写) border border border-bottom ...

  3. centos mono

    wget http://download.mono-project.com/sources/mono/mono-4.0.1.tar.bz2wget http://download.mono-proje ...

  4. 获取表空间的语句 以及 建表和索引的ddl

    alter session set container=PHD1; SET SERVEROUTPUT ON SET LINESIZE SET FEEDBACK OFF SET PAGESIZE sel ...

  5. pom 的scope标签分析

    一.compile:编译范围compile是默认的范围:如果没有提供一个范围,编译范围依赖在所有的classpath 中可用,同时它们也会被打包.而且这些dependency会传递到依赖的项目中. 二 ...

  6. 【servlet】 第一个servlet

    简单打印haha Helloyt.java package day01; import java.io.IOException; import javax.servlet.ServletConfig; ...

  7. php redis 消息队列

    redis是什么东西就不多说了,网上文章一搜一大堆. 首先来说一下我要实现的功能: 类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时 ...

  8. Android Matrix类以及ColorMatri

    引自:http://www.chinabaike.com/t/37396/2014/0624/2556217.html Android Matrix类以及ColorMatrix类详解 最近在系统学习了 ...

  9. 使用runloop阻塞线程的正确写法

    使用runloop阻塞线程的正确写法 runloop可以阻塞线程,等待其他线程执行后再执行. 比如: @implementation ViewController{    BOOL end;}…– ( ...

  10. Android接收wifi路由器发送过来的一组字节数据

    1.字节数组转换为字符串 byte[] byBuffer = new byte[20];... ...String strRead = new String(byBuffer);strRead = S ...