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