iBatis/MyBatis 主子表关联查询

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

package com.test.ibatis.po; import java.util.List; /** * 主表对应数据 */ public class Master implements java.io.Serializable { private static final long serialVersionUID = 1L; /** ID */ private String channelsId = null; /** 地址 */ private String deliveryLoc = null; /** 对应子表数据 */ private List<Detail> details = null; public String getChannelsId() { return channelsId; } public void setChannelsId(String channelsId) { this.channelsId = channelsId; } public String getDeliveryLoc() { if (deliveryLoc == null) return ""; return deliveryLoc; } public void setDeliveryLoc(String deliveryLoc) { this.deliveryLoc = deliveryLoc; } public List<Detail> getDetails() { return details; } public void setDetails(List<Detail> details) { this.details = details; } }

 

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

package com.test.ibatis.po; import java.text.DecimalFormat; public class Detail implements java.io.Serializable { private static final long serialVersionUID = 1L; private static final DecimalFormat df = new DecimalFormat("###0.00"); /** 产品编号 */ private String partNo = null; /** 价格 */ private String price = null; public String getPartNo() { return partNo; } public void setPartNo(String partNo) { this.partNo = partNo; } public String getPrice() { if (price == null) return "0"; return df.format(Double.parseDouble(price) / 1000.0); } public void setPrice(String price) { this.price = price; } }

 

sql如下配置:

<?xml version="1.0" encoding="gbk" ?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap namespace="TEST_SQL"> <typeAlias alias="HashMap" type="java.util.HashMap" /> <!-- Master对象定义 --> <resultMap id="master" class="com.test.ibatis.po.Master"> <result property="channelsId" column="ORDER_CHANNEL" /> <result property="deliveryLoc" column="DELIVER_ADDRESS" /> <result property="details" column="{province=PROVINCE_CODE,id=ORDER_ID,VENDER=TERMINAL_VENDER}" select="select-dtl" /> </resultMap> <!-- Detail对象定义 --> <resultMap id="detail" class="com.linkage.ess.ordercreate.po.OrderDetail"> <result property="partNo" column="PROPERTY_CODE" /> <result property="price" column="SALE_PRICE" /> </resultMap> <select id="selectData" resultMap="master"> <!--[CDATA[ SELECT T.RELATE_ID ORDER_CHANNEL, T.STOCK_ADDRESS DELIVER_ADDRESS FROM MASTER T WHERE T.PROVINCE_ID = #PROVINCE_ID# AND T.STATE = '1' ]]> </select> <statement id="select-dtl" resultMap="detail"> <![CDATA[ SELECT D.PROPERTY_CODE, D.SALE_PRICE, FROM DETAIL D WHERE D.ORDER_ID = #id# AND D.TERMINAL_VENDER = #VENDER# AND D.PROVINCE_ID = #province# ]]--> </statement> </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" />

的配置,

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

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

你可能感兴趣的:(String,HashMap,null,Class,Terminal,encoding)