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

时间: 2024-10-12 00:29:02

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

一对多数据库设计

现在正在搞一个具有层级结构的数据存储,因为数据只存在一对多关系,因此使用外键联合这种形式 具体地,就是一个部门下有部门以及车辆,这就是一种层级结构,设计的就是一对多,主键外键链接,当从服务端拿到数据解析的时候分别更新部门和车辆,更新的同时将他们的对应关系做好,如果之后有新增车辆或者部门的话,那么就首先查到所属部门是那个,数据库中有就拿到他的主键作为新增部门或者车辆的外键,如果没有这个部门首先就要插入这个部门. 实际上,更多的需要学习数据库基础的知识,例如主键外键,左连接,右链接等等,具体的业务是

数据库设计中一对多的解决方法.

1.位运算的思想 原文连接:http://www.tiyee.net/post/178 作者:tiyee 当我们在设计数据库的数据表时,经常会遇到一对多的数据结构,如文章的tag等,比如本人之前在设计手机app的后端的时候,就碰到了这个问题, 当时涉及中小学教材的诗歌诗歌表(poetry)和出版社表(poetry_press),因为一首诗可能会涉及多个出版社,而且出版社的数量并不是很多.为了便于搜索,如果把所有出版社的ID用分隔符组合成一个字符串肯定不符合要求.所以一般都是单独使用一个表来存储他

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

iBATIS的多对多映射配置方法和多对一映射配置方法差不多,不同的是,多对多映射,数据库设计上需要一个记录两个类关系的中间表,本文以学生-老师为例,在iBATIS的sqlmap中配置多对多关系. iBATIS的多对多映射配置1,建表.数据库中三个表,分别为: 1 CREATE TABLE [student] ( 2 [id] [int] IDENTITY (1, 1) NOT NULL , 3 [name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NO

简述数据库设计中一对多和多对多的应用场景?

做一个项目,必然是少不了数据库设计的!在学习阶段,基本都是单表.然而在实际开发过程中,一对多,多对多的表处处都是!简单整理一下,一对多,多对多表如何设计整理一下思路:     数据库实体间有三种对应关系:一对一,一对多,多对多. 一对一关系示例: 一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号. 一对多关系示例: 一个学生只属于一个班,但是一个班级有多名学生. 多对多关系示例: 一个学生可以选择多门课,一门课也有多名学生. 一.关系的实现 在实体关系模型中,我们知道有三种关系:一对

数据库设计【笔记】

数据库设计 一.设计步骤   1.收集信息(来源项目需求分析)   2.标识实体(一般是需求分析中需要管理的信息名词)   3.标识每个实体的属性   4.实体之间的关系二.画e-r图(实体关系图)   1.矩形表示实体   2.椭圆表示实体的属性   3.菱形表示实体之间的关系   4.用直线连接实体和属性,实体和实体之间的关系三.实体之间的关系:   1.一对一  1:1          车和车位   2.一对多  1:N (1:M) 客人和客房   3.多对多  N:M         

mysq数据库设计(主键与外键)

主键可以是真实实体的属性,但是常用的好的解决方案是,利用一个与实体信息不相关的属性,作为唯一标示(加个id字段)主键与业务逻辑不发生关系,只用来标示记录 可以在定义完字段后,再定义多列主键(组合主键) 例:primary key(id,name,age);(不是说3个字段都是主键,因为一个表只能有一个主键,可以是3个字段组合成的主键) 设计: 两个实体表内,存在相同的主键字段 如果记录的主键值等于另一个关系表内记录的主键则两天记录对应 1:1对应  数据库设计的时候(常用的信息和不常用的信息分开

5-2数据库设计

5-2数据库设计 tags:数据库 基本步骤 步骤: 1. 需求分析阶段 进行数据库设计首先必须准确了解与分析用户需求.需求分析是整个设计过程的基础,是最困难和最耗费时间的一步. 2. 概念结构设计阶段 概念设计是整个数据库设计的关键,它通过对用户需求进行综合.归纳与抽象,行程一个独立于具体数据库管理系统的概念模型. 在概念结构设计阶段行程独立于机器特点,独立于各个关系数据库管理系统产品的概念模式,一般用ER图表示 3. 逻辑结构设计阶段 逻辑结构设计是将概念结构转为某个数据库管理系统所支持的数

规范化-数据库设计原则

关系数据库设计的核心问题是关系模型的设计.本文将结合具体的实例,介绍数据库设计规范化的流程. 摘要 关系型数据库是当前广泛应用的数据库类型,关系数据库设计是对数据进行组织化和结构化的过程,核心问题是关系模型的设计.对于数据库规模较小的情况,我们可以比较轻松的处理数据库中的表结构.然而,随着项目规模的不断增长,相应的数据库也变得更加复杂,关系模型表结构更为庞杂,这时我们往往会发现我们写出来的SQL语句的是很笨拙并且效率低下的.更糟糕的是,由于表结构定义的不合理,会导致在更新数据时造成数据的不完整.

数据库设计中的一些原则

1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体. 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体. 这里的实体可以理解为基本表.明确这种对应关系后,对我们设计录入界面大有好处. [例1]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会关系表.工作简历表.   这就是"一张原始单证对应多个实体"的典型例子. 2.