`
sunbin
  • 浏览: 353194 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ibatis 子对象查询

 
阅读更多

方法一:

主表:MASTER

字段:ORDER_ID  --主键

         RELATE_ID --申请单位

         STOCK_ADDRESS --仓库地址

         TERMINAL_VENDER --供应商

         PROVINCE_ID --省分ID

         STATE --状态

 

子表:DETAIL

字段:ORDER_ID   --与主表ORDER_ID关联

         PROPERTY_CODE  --属性编码

         SALE_PRICE  --价格

         TERMINAL_VENDER --供应商 与主表TERMINAL_VENDER关联

         PROVINCE_ID --省分ID 与主表PROVINCE_ID关联

 

主键为 ORDER_ID + PROPERTY_CODE

 

要求,取得 主表:MASTER 中STATE为1的记录,并映射成易于操作的java对象。

并关联子表,ORDER_ID、TERMINAL_VENDER、PROVINCE_ID作为查询子表的条件。

将查询出的子表数据映射成List<Object> ,作为 主表映射成对象的一个 成员变量。

以便后续操作。

 

定义java对象 Master,对应主表数据:

 

  1. 1package com.test.ibatis.po;  
  2.  2 
  3.  3import java.util.List;  
  4.  4 
  5.  5/** *//**  
  6.  6 * 主表对应数据  
  7.  7 */ 
  8.  8public class Master implements java.io.Serializable {  
  9.  9    private static final long serialVersionUID = 1L;  
  10. 10    /** *//** ID */ 
  11. 11    private String            channelsId       = null;  
  12. 12    /** *//** 地址 */ 
  13. 13    private String            deliveryLoc      = null;  
  14. 14 
  15. 15    /** *//** 对应子表数据 */ 
  16. 16    private List<Detail> details          = null;  
  17. 17 
  18. 18    public String getChannelsId() {  
  19. 19        return channelsId;  
  20. 20    }  
  21. 21 
  22. 22    public void setChannelsId(String channelsId) {  
  23. 23        this.channelsId = channelsId;  
  24. 24    }  
  25. 25 
  26. 26    public String getDeliveryLoc() {  
  27. 27        if (deliveryLoc == null)  
  28. 28            return "";  
  29. 29        return deliveryLoc;  
  30. 30    }  
  31. 31 
  32. 32    public void setDeliveryLoc(String deliveryLoc) {  
  33. 33        this.deliveryLoc = deliveryLoc;  
  34. 34    }  
  35. 35 
  36. 36    public List<Detail> getDetails() {  
  37. 37        return details;  
  38. 38    }  
  39. 39 
  40. 40    public void setDetails(List<Detail> details) {  
  41. 41        this.details = details;  
  42. 42    }  
  43. 43

定义Detail类,对应子表数据:

 

  1.  1package com.test.ibatis.po;  
  2.  2 
  3.  3import java.text.DecimalFormat;  
  4.  4 
  5.  5public class Detail implements java.io.Serializable {  
  6.  6    private static final long          serialVersionUID = 1L;  
  7.  7 
  8.  8    private static final DecimalFormat df               = new DecimalFormat("###0.00");  
  9.  9    /** *//** 产品编号 */ 
  10. 10    private String                     partNo           = null;  
  11. 11    /** *//** 价格 */ 
  12. 12    private String                     price            = null;  
  13. 13 
  14. 14    public String getPartNo() {  
  15. 15        return partNo;  
  16. 16    }  
  17. 17 
  18. 18    public void setPartNo(String partNo) {  
  19. 19        this.partNo = partNo;  
  20. 20    }  
  21. 21 
  22. 22    public String getPrice() {  
  23. 23        if (price == null)  
  24. 24            return "0";  
  25. 25        return df.format(Double.parseDouble(price) / 1000.0);  
  26. 26    }  
  27. 27 
  28. 28    public void setPrice(String price) {  
  29. 29        this.price = price;  
  30. 30    }  
  31. 31}  
  32.  

sql如下配置:
 

  1.  1<?xml version="1.0" encoding="gbk" ?>  
  2.  2 
  3.  3<!DOCTYPE sqlMap        
  4.  4    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"        
  5.  5    "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
  6.  6<sqlMap namespace="TEST_SQL">  
  7.  7    <typeAlias alias="HashMap" type="java.util.HashMap" />  
  8.  8 
  9.  9    <!-- Master对象定义 -->  
  10. 10    <resultMap id="master" class="com.test.ibatis.po.Master">  
  11. 11        <result property="channelsId" column="ORDER_CHANNEL" />  
  12. 12        <result property="deliveryLoc" column="DELIVER_ADDRESS" />  
  13. 13        <result property="details" column="{province=PROVINCE_CODE,id=ORDER_ID,VENDER=TERMINAL_VENDER}" 
  14. 14            select="select-dtl" />  
  15. 15    </resultMap>  
  16. 16    <!-- Detail对象定义 -->  
  17. 17    <resultMap id="detail" class="com.linkage.ess.ordercreate.po.OrderDetail">  
  18. 18        <result property="partNo" column="PROPERTY_CODE" />  
  19. 19        <result property="price" column="SALE_PRICE" />  
  20. 20    </resultMap>  
  21. 21    <select id="selectData" resultMap="master">  
  22. 22    <!--[CDATA[  
  23. 23        SELECT T.RELATE_ID ORDER_CHANNEL,  
  24. 24               T.STOCK_ADDRESS DELIVER_ADDRESS  
  25. 25         FROM MASTER T  
  26. 26         WHERE T.PROVINCE_ID = #PROVINCE_ID#  
  27. 27         AND T.STATE = '1' 
  28. 28    ]]>  
  29. 29    </select>  
  30. 30    <statement id="select-dtl" resultMap="detail">  
  31. 31    <![CDATA[  
  32. 32        SELECT D.PROPERTY_CODE,  
  33. 33               D.SALE_PRICE,  
  34. 34         FROM DETAIL D  
  35. 35         WHERE D.ORDER_ID = #id#  
  36. 36         AND D.TERMINAL_VENDER = #VENDER#  
  37. 37         AND D.PROVINCE_ID = #province#  
  38. 38    ]]-->  
  39. 39    </statement>  
  40. 40</sqlMap> 

这样所有的工作都OK,

执行

 

List<Master> masters = (List<Master>) sqlMap.queryForList("selectData", param);

// param 为HashMap, put("PROVINCE_ID", "BJ"); 作为查询条件用。

 

 

得到 List<Master>,其中每个Master对象,都会持有 List<Detail>。


 

要点在于

<result property="details" column= "{province=PROVINCE_CODE,id=ORDER_ID,VENDER=TERMINAL_VENDER}"
            select="select-dtl" />

的配置,

即 将主表中的值传到 子查询当中作为查询条件,

这样取得的数据就是 有关系的了。

 

方法二:

ibatis的子对象查询, 填充到List<E> 中

<resultMap id="memberResult" type="member">

<id property="id" column="ID" />

<id property="memberID" column="MEM_ID" />

<id property="userName" column="MEN_NAME" />

<id property="fullName" column="NAME" />

<id property="memberCode" column="MEM_NUM" />

<id property="activateCode" column="ACTIVATE_CODE" />

<id property="cardNo" column="CARD_NO" />

<id property="cardLevel" column="CARD_LEVEL" />

<id property="memberType" column="MEM_TYPE" />

<id property="memberHierarchy" column="MEM_TIER" />

<id property="registerSource" column="ENROLL_CHANNEL" />

<id property="registerDate" column="ENROLL_DATE" />

<id property="remindQuestion" column="QUESTION" />

<id property="remindAnswer" column="ANSWER" />

<id property="status" column="STATUS" />

<id property="email" column="EMAIL" />

<id property="cellPhone" column="PHONE" />

<id property="password" column="PASSWORD" />

<id property="lastUpd" column="LAST_UPD"/>

<id property="newMemberHierarchy" column="NEW_MEM_TIER" />

<id property="identityType" column="IDENTITY_TYPE" />

<id property="identityNo" column="IDENTITY_NO" />

<id property="title" column="TITLE" />

<id property="mcMemberCode" column="MC_MEMBER_CODE" />

<id property="thirdpartyType" column="THIRDPARTY_TYPE" />

    <id property="mCustomerId" column="M_CUSTOMER_ID" />

<collection property="cardList" column="ID" javaType="ArrayList" ofType="memberMemCard"  select="queryCardInfoByMemberInfoId" />

<collection property="memberVerfyList" column="ID" javaType="ArrayList" ofType="memberVerfy"  select="queryVerifyInfoByInfoId" />

</resultMap>

分享到:
评论

相关推荐

    ibatis单个对象的各种操作

    本篇文章将主要探讨如何使用Ibatis对单个对象进行各种操作,包括插入、更新、删除和查询。我们将通过源码解析和工具使用来深入理解这一过程。 首先,Ibatis的配置文件是整个框架的核心,它定义了数据源、事务管理...

    Ibatis数据表对象自动生成器

    Ibatis 数据表对象自动生成器 自动生成针对配置好的每个表的XML文件和VO(DTO)文件

    主子表查询ibatis

    本文将深入探讨如何在iBATIS中进行主子表查询,以及涉及到的相关技术如一对多关系、日志管理库log4j等。 首先,主子表查询是数据库设计中常见的场景,通常涉及到一个“父”表(主表)和一个或多个“子”表(从表)...

    ibatis总结 ibatis ibatis ibatis ibatis

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

    ibatis and和or联合查询 .doc

    ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或注解进行配置,将接口及Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。 #### 二、and与or联合查询基础 在SQL查询中,`AND...

    iBatis开发指南和一个iBatis实例

    例如,你可能看到如何使用iBatis进行增删改查操作,以及如何处理复杂查询,如联接查询、子查询等。 "iBatis开发指南"则是更全面的官方文档,它包含了iBatis的所有特性和使用方法。从中,你可以学习到动态SQL的使用...

    IBATIS开发使用实例

    IBATIS允许程序员直接编写原生态SQL,并支持高级映射机制,使得Java对象和数据表之间能够轻松映射,极大地简化了基于SQL的程序的编码工作。 ### 复杂SQL查询解析 #### SQL语句结构分析 提供的SQL查询语句展示了...

    IBatis.NET开发文档

    - 复杂查询:涉及子查询,联合查询,存储过程的调用等。 - 缓存机制:讲解iBATIS的缓存策略,如何启用和配置缓存以提高性能。 - 异常处理:介绍iBATIS抛出的异常类型及其处理方式。 - 批量操作:如何利用iBATIS...

    iBatis各种文档集合

    文档中应该会有实例展示如何利用动态SQL来实现条件查询、聚合函数和子查询等功能。 最后,文档可能还会涉及到iBATIS的高级特性,比如缓存机制,它可以提高数据访问的性能。iBATIS提供了本地缓存和二级缓存两种方式...

    spring+ibatis+jDom递归生成

    当我们谈论“spring+ibatis+jDom递归生成”时,可能是指在Spring应用中,使用iBatis进行数据查询,然后利用jDom解析返回的XML数据,通过递归方法构建复杂的对象树。以下是一种可能的实现方式: 1. 首先,在Spring...

    myBatis和ibatis的区别

    - **对象关系映射(ORM)**:ibatis更多关注SQL查询的映射,而myBatis在此基础上加强了对象关系映射的能力,更好地实现了SQL与Java对象之间的转换。 #### 七、结论 通过对ibatis与myBatis之间区别的详细分析,我们...

    ibatis one to many mapping

    在一对多映射中,association 标签用于定义主对象中包含的子对象集合。 4. **collection** 标签:这是 iBatis 用于表示一对多关系的主要标签。它定义了主对象中的集合属性,如 List 或 Set,以及如何从查询结果中...

    IBatis.pdf

    1. **复杂查询**:当需要进行复杂的数据库查询,如分页、联合查询、子查询时,IBatis 提供的 SQL 映射和动态 SQL 功能非常有用。 2. **性能优化**:通过缓存机制,可以减少对数据库的频繁访问,提高系统性能。 3. ...

    iBATIS实战

    学习如何编写这些文件,包括INSERT、UPDATE、DELETE和SELECT语句,以及如何处理复杂的查询,如联接、子查询等。 3. **Mapper接口与XML配置**:iBATIS支持通过Java接口定义SQL操作,然后在XML文件中实现这些操作。...

    ibatis资料大全

    - **定义**:ibatis是一个开源的持久层框架,它简化了Java应用程序与数据库之间的交互过程,但相较于其他如Hibernate这样的“一站式”ORM解决方案,ibatis更加侧重于SQL语句的手动编写和SQL与Java对象之间的映射配置...

    ibatis源代码项目

    iBatis是由Clinton Begin创建的一个开源项目,最初是Apache基金会的子项目,后来转为MyBatis。它的主要功能包括:动态SQL、映射文件解析、事务管理等。通过XML或注解方式配置SQL语句,实现了SQL与Java代码的解耦,...

    ibatis jar文件

    描述中提到的几个版本和子项目,包括mybatis3.0.5、ibatis-core-3.0、ibatis-core-3.0-sources、ibatis-dao-2、ibatis-sqlmap-2,这些是iBATIS不同版本和组件的标识: 1. mybatis3.0.5:这是MyBatis的3.0.5版本,...

    ibatis 一对多 多对多完整映射

    对应于`selectOrdersByUserId`,你需要编写一个SQL查询,它将根据父对象的主键值(这里是`user_id`)来获取子对象。 ```xml SELECT * FROM orders WHERE user_id = #{userId} ``` **多对多关系映射** 多对多...

    修改ibatis源代码实现物理分页

    Ibatis,作为一款轻量级的Java持久层框架,虽然功能强大,但在默认情况下,其分页方式是逻辑分页,即先查询所有数据,然后在应用程序层面进行分页处理,这种方式对于大数据量的查询来说,无疑会消耗大量的内存和CPU...

Global site tag (gtag.js) - Google Analytics