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