ALL is Well!

敏捷是一条很长的路,摸索着前进着

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  30 随笔 :: 23 文章 :: 71 评论 :: 0 Trackbacks

主表: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,对应主表数据:

 1package com.test.ibatis.po;
 2
 3import java.util.List;
 4
 5/**
 6 * 主表对应数据
 7 */

 8public class Master implements java.io.Serializable {
 9    private static final long serialVersionUID = 1L;
10    /** ID */
11    private String            channelsId       = null;
12    /** 地址 */
13    private String            deliveryLoc      = null;
14
15    /** 对应子表数据 */
16    private List<Detail> details          = null;
17
18    public String getChannelsId() {
19        return channelsId;
20    }

21
22    public void setChannelsId(String channelsId) {
23        this.channelsId = channelsId;
24    }

25
26    public String getDeliveryLoc() {
27        if (deliveryLoc == null)
28            return "";
29        return deliveryLoc;
30    }

31
32    public void setDeliveryLoc(String deliveryLoc) {
33        this.deliveryLoc = deliveryLoc;
34    }

35
36    public List<Detail> getDetails() {
37        return details;
38    }

39
40    public void setDetails(List<Detail> details) {
41        this.details = details;
42    }

43}

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

 1package com.test.ibatis.po;
 2
 3import java.text.DecimalFormat;
 4
 5public class Detail implements java.io.Serializable {
 6    private static final long          serialVersionUID = 1L;
 7
 8    private static final DecimalFormat df               = new DecimalFormat("###0.00");
 9    /** 产品编号 */
10    private String                     partNo           = null;
11    /** 价格 */
12    private String                     price            = null;
13
14    public String getPartNo() {
15        return partNo;
16    }

17
18    public void setPartNo(String partNo) {
19        this.partNo = partNo;
20    }

21
22    public String getPrice() {
23        if (price == null)
24            return "0";
25        return df.format(Double.parseDouble(price) / 1000.0);
26    }

27
28    public void setPrice(String price) {
29        this.price = price;
30    }

31}


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

的配置,

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

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

本文为原创,欢迎转载,转载请注明出处BlogJava

posted on 2010-09-01 12:32 李 明 阅读(8937) 评论(5)  编辑  收藏 所属分类: MyBatis/iBatis

评论

# re: iBatis/MyBatis 主子表关联查询 2011-03-15 00:50 孟天歌
要是反过来怎么办?


Detail .java里面

有个master属性

private Master master;

怎么能查找到某Detail 对应的master信息
  回复  更多评论
  

# re: iBatis/MyBatis 主子表关联查询 2011-03-16 09:07 李 明
@孟天歌
是一样的道理啊。
我之所以把它们叫做Master和detail的原因是想体现一种 主子表 的关系。
如果你想定义类 Detail里包含Master对象,那么就是 表 Detail表是主表,而Master表是子表了。

这些java类是你自己设计的,你的目的是要符合表的关系才行啊。并不是随意设定的。
如果有其他问题也请联系。  回复  更多评论
  

# re: iBatis/MyBatis 主子表关联查询[未登录] 2011-11-04 17:47 simon
{province=PROVINCE_CODE,id=ORDER_ID,VENDER=TERMINAL_VENDER}


为啥我指定了多列就报错.?
  回复  更多评论
  

# re: iBatis/MyBatis 主子表关联查询[未登录] 2013-05-22 23:51 Ryan
mybatis3不能这样吧?result没有select参数?  回复  更多评论
  

# re: iBatis/MyBatis 主子表关联查询[未登录] 2014-06-24 11:34 你好
好像真没有select参数,result中加了select就报错。@Ryan
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: