`

ibatis 表与表的关联查询

阅读更多

ibatis高级特性,处理表与表之间的关联。ibatis中,提供了Statement嵌套支持,通过Statement嵌套,我们可以实现关联数据的操作。

  用表lock和key为例,一个lock可以配多个key,一个key只能对应一个lock.

1、数据库表

 

create table lock(  
    id int,  
    lockName varchar  
);  
create table key(  
    id int,  
    lockId int,  
    keyName varchar  
);

2、定义映射类: 

  在进行表关联的时候一定要注意:关联的2个pojo之间的联系,还有就是配置文件之间的关联。 

 

public class Key {  
          
    private int id;  
        private int lockId;  
        private String keyName;  
        private Lock lock;  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public int getLockId() {  
        return lockId;  
    }  
    public void setLockId(int lockId) {  
        this.lockId = lockId;  
    }  
    public String getKeyName() {  
        return keyName;  
    }  
    public void setKeyName(String keyName) {  
        this.keyName = keyName;  
    }  
    public Lock getLock() {  
        return lock;  
    }  
    public void setLock(Lock lock) {  
        this.lock = lock;  
    }  
      
}  
public class Lock {  
        private int id;  
        private String lockName;  
        private List<Key> keys;   
          
        public int getId() {  
            return id;  
        }  
        public void setId(int id) {  
            this.id = id;  
        }  
        public String getLockName() {  
            return lockName;  
        }  
        public void setLockName(String lockName) {  
            this.lockName = lockName;  
        }  
        public List<Key> getKeys() {  
            return keys;  
        }  
        public void setKeys(List<Key> keys) {  
            this.keys = keys;  
        }  
}

3、 配置ibatis的 SqlMapping 文件

 

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"  
   "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
<sqlMap namespace="lock">     
  <typeAlias alias="Key" type="com.longsky.ibatis.lock.model.Key"/>     
  <typeAlias alias="Lock" type="com.longsky.ibatis.lock.model.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 lock_key_table  
     ]]>     
  </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="getKeysByLockId" parameterClass="int" resultClass="key">     
     <![CDATA[     
        select id,lockId,keyName from lock_key_table where lockId = #value#     
     ]]>     
  </select>  
</sqlMap>
 

4、测试类:

 

import java.io.IOException;  
import java.io.Reader;  
import java.sql.SQLException;  
import java.util.List;  
import com.ibatis.common.resources.Resources;  
import com.ibatis.sqlmap.client.SqlMapClient;  
import com.ibatis.sqlmap.client.SqlMapClientBuilder;  
import com.longsky.ibatis.lock.model.Key;  
import com.longsky.ibatis.lock.model.Lock;  
public class Test {  
    @SuppressWarnings("unchecked")  
    public static void main(String[] args) throws SQLException {  
        SqlMapClient sqlMapper=null ;  
        try{  
            Reader reader = Resources.getResourceAsReader("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<Lock> locks=(List<Lock>)sqlMapper.queryForList("selectAllLocks");  
            //取Lock对象。  
            for(int i=0;i<locks.size();i++){  
            Lock lock=(Lock)locks.get(i);  
            System.out.println("lock name = ["+lock.getLockName()+"] has keys as follows:");  
            //从Lock对象取List<Key>。  
            List<Key> keys=lock.getKeys();  
            for(int j=0;j<keys.size();j++){  
                System.out.println("key"+j+":"+keys.get(i).getKeyName());  
            }  
       }  
    }  
}

 

多表关联查询大量数据时建议采用存储过程来处理。

 

分享到:
评论
2 楼 温柔的羊 2011-09-06  
key
java_ganbin 写道
写得不够详细,lock_key_table哪来的?没看到你创建

和key表作用类似
1 楼 java_ganbin 2011-09-01  
写得不够详细,lock_key_table哪来的?没看到你创建

相关推荐

    主子表查询ibatis

    使用ibatis配置的主子表关联查询的实例,一对多关系,在控制台打印,有log4j的使用,打印结果详细,(码云同步)

    Ibatis查询语句里,可以使用多表查询

    Ibatis查询语句里,可以使用多表查询,返回多个表的值.doc

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis配置多表关联(一对一、一对多、多对多

    ibatis and和or联合查询 .doc

    ibatis and和or联合查询 .doc

    使用ibatis操作两个有关系的表

    ibatis 的小例子,主要是通过ibatis来处理2个数据表,其中数据表直接是有关系的

    Ibatis的简单例子(增删改查,联合查询等)

    一个Ibatis+Mysql的简单例子,有数据库文件。希望对初学者有所帮助!

    iBatis条件查询

    iBatis做的按条件查询,没关联其他表,内带Mysql,适用于小型项目,hibernate是全自动化,如有朋友想学习下半自动化持久层框架,那就来下载这个看看吧。。

    spring+ibatis 多表

    框架:spring ibatis jquery 数据库: mysql 2个关联关系的表 有分页查询

    ibatis的实现(包含模糊查询、关联查询、增删改查)

    ibatis的实现(包含模糊查询、关联查询、增删改查) 数据库sql server 2005

    ibatis配置文件介绍

    iBATIS是以SQL为中心的持久化层框架。能支持懒加载、关联查询、继承等特性

    ibatis+Spring demo

    内容包里面是源代码,运行该例子的方式就是,使用里面的sql文件还原数据库。...使用cmd进入该解压包,运行 java -jar *.jar ibatis2spring....欲了解代码的详细,请访问作者博客,搜索《ibatis + Spring 多表查询》文章。

    iBatis SQL Maps开发指南.pdf

    延迟加载 VS 联合查询(1:1) 复杂类型集合的属性 避免N+1 Select(1:M和M:N) 组合键值或多个复杂参数属性 支持Parameter Map和Result Map的数据类型 缓存Mapped Statement结果集 只读 VS 可读写 Serializable可...

    iBATIS教程

    一个映射层,在对象和数据库间传递数据,并保持两者与映射层本身相独立 iBATIS则与之不同,它不是直接在类与数据表或字段与列之间进行关联,而是把SQL语句的参数(parameter)和返回结果(result)映射至类。...

    iBATIS实战

    9.3.4 联合使用readOnly属性和serialize属性 159 9.4 如何使用高速缓存模型中的标签 160 9.4.1 高速缓存的清除 160 9.4.2 设置高速缓存模型实现的特性 163 9.5 高速缓存模型的类型 163 9.5.1 MEMORY 163 9.5.2 LRU ...

    Java iBatis源码范例和教程

    一个映射层,在对象和数据库间传递数据,并保持两者与映射层本身相独立 iBATIS则与之不同,它不是直接在类与数据表或字段与列之间进行关联,而是把SQL语句的参数(parameter)和返回结果(result)映射至类。...

    ibatis实战之一对多关联(源代码)

    ibatis实战之一对多关联源代码 文章地址:http://blog.csdn.net/itmyhome1990/article/details/30050183

    iBatisMyBatis 主子表关联查询 .doc

    iBatisMyBatis 主子表关联查询 .doc

    ibatis2所需jar包

    iBATIS[2]是一个可以设计和实现更好的 Java/.NET 应用程序持久化层的框架。iBATIS 把对象和存储过程或者使用 XML 描述符的 SQL 语句进行了关联。简单是 iBATIS 最大的优势

    ibatis2.x 详细介绍

    MEMORY 类型Cache 与WeakReference ........................................ 40 LRU 型Cache ....................................................................................... 42 FIFO 型Cache ........

    IBatis简单使用

    IBatis完成学员的增删改查,无关联关系。

Global site tag (gtag.js) - Google Analytics