`

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多表查询

    `user`表存储用户信息,包括`id`(主键),`name`,以及`book_oid`字段,这是一个外键,引用`book`表的`oid`,表示一个用户可以与多本书关联。 对应的Pojo类是Java对象,用于封装数据库中的数据。`User`类包含`id`,`...

    Ibatis多表查询

    为了演示Ibatis的多表查询功能,本文档采用了一个简单的例子:一个图书 (`book`) 表和一个用户 (`user`) 表,其中图书表与用户表之间存在一对多的关系。这意味着每本书可以有多个作者。 **图书表 (`book`) 结构:** ...

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

    多表查询通常涉及到 JOIN 操作,例如内连接(INNER JOIN)、左连接(LEFT JOIN)等,这些操作可以帮助我们从多个相关联的表中获取所需的数据。 #### 三、多表查询示例分析 根据提供的部分代码,我们可以看到一个多...

    ibatis多表查询过程

    当我们需要进行多表查询时,iBatis提供了一种高效且易于管理的方式。本文将深入探讨iBatis在处理多表查询时的具体步骤和技巧。 ### 1. iBatis简介 iBatis 是一个基于Java的持久层框架,它简化了数据库访问,并避免...

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

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

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

    在XML映射文件中,你可以使用标签或在标签内直接编写JOIN语句,以实现多个表的数据联合查询。记得在Mapper接口中定义对应的方法。 6. **Service层和DAO层**: 在实际项目中,我们通常会创建Service层来封装业务...

    ibatis and和or联合查询 .doc

    根据提供的部分代码,我们可以详细分析如何在ibatis中实现and与or联合查询。 ```xml &lt;![CDATA[starttime&gt;=#starttime#]]&gt; &lt;![CDATA[starttime]]&gt; &lt;![CDATA[rentcompany like '%$rentcompany%']]&gt; ...

    Ibatis复杂查询语句.doc

    在Ibatis中,复杂查询通常涉及到多个表的联接、条件动态拼接、子查询以及各种数据类型的处理。文档"Ibatis复杂查询语句.doc"所展示的查询语句就是一个很好的例子,展示了Ibatis如何处理复杂的数据库操作。接下来,...

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

    在Ibatis中,我们可以通过`&lt;resultMap&gt;`标签定义映射关系,然后在SQL查询中使用`&lt;association&gt;`标签来获取关联的数据。 2. **一对多映射**:如果一个表的数据对应另一个表的多条记录,例如订单表和订单详情表,一个...

    ibatis 文档查询

    iBATIS允许开发者通过XML配置文件来定义SQL语句和结果映射,这使得SQL与Java代码解耦,提高了代码的可维护性。虽然Java版本的iBATIS对XML数据的操作可能不再那么重要,但在某些场景下仍然有价值。iBATIS.NET则保留...

    ibatis总结 ibatis ibatis ibatis ibatis

    - 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大的情况下。 - 避免在`WHERE`子句中使用多个条件或`OR`操作符,而是应该使用`IN`操作符或者`UNION ALL`合并多个查询。 3. Struts、Spring与Ibatis...

    ibatis做连接查询 .doc

    在Java开发中,iBatis是一个流行的数据访问框架,它允许开发者将SQL语句与Java代码分离,提供了一种更灵活的方式来处理数据库操作。本文将详细介绍如何使用iBatis进行连接查询。 首先,我们需要理解iBatis的工作...

    iBatis条件查询

    在本资源中,"iBatis条件查询"着重展示了如何根据业务需求定制SQL语句进行数据检索,尤其在不涉及复杂关联查询的情况下,iBatis可以提供高效且简单的解决方案。 首先,iBatis的核心概念是SQL Map,它是一个XML配置...

    iBatis与数据库交互

    1. 易于使用:通过简单的XML或注解配置,可以轻松地将SQL语句与Java代码关联起来。 2. 动态SQL:支持条件判断、循环等动态构建SQL,使得SQL更具灵活性。 3. 缓存机制:内置了本地缓存和二级缓存,提高数据访问效率。...

    IBATIS开发使用实例

    本文将围绕“IBATIS开发使用实例”这一主题,深入解析复杂SQL查询的应用,尤其是如何利用SQL进行多表关联、条件筛选以及聚合函数的使用。 ### IBATIS简介 IBATIS,现被称为MyBatis,是一种优秀的持久层框架,它...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis提供了多种方式来实现映射,如自动类型匹配、自定义类型处理器、复杂关联映射等。 7. **缓存机制**:Ibatis内置了本地缓存和二级缓存,可以提高数据读取速度。本地缓存作用于单个SqlSession,而二级缓存则...

    spring+ibatis 多表

    综上所述,"spring+ibatis 多表"项目涉及了后端的Spring和iBatis框架,它们共同处理数据库交互,特别是涉及到多表关联查询的复杂操作。前端则利用jQuery进行交互设计,包括分页查询的实现。这样的组合提供了一种高效...

    ibatis教程_查询指定id的单个对象

    在上述代码中,`sqlSessionFactory`是通过读取SqlMapConfig.xml创建的,`getMapper()`方法将Mapper接口与XML配置关联,然后就可以调用接口中的方法执行SQL并获取结果。 此外,Ibatis支持动态SQL,如`&lt;if&gt;`、`...

Global site tag (gtag.js) - Google Analytics