主表: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,对应主表数据:
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类,对应子表数据:
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如下配置:
<!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" />
的配置,
即 将主表中的值传到 子查询当中作为查询条件,
这样取得的数据就是 有关系的了。