方法一:
主表: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" />
的配置,
即 将主表中的值传到 子查询当中作为查询条件,
这样取得的数据就是 有关系的了。
方法二:
ibatis的子对象查询, 填充到List<E> 中
<resultMap id="memberResult" type="member">
<id property="id" column="ID" />
<id property="memberID" column="MEM_ID" />
<id property="userName" column="MEN_NAME" />
<id property="fullName" column="NAME" />
<id property="memberCode" column="MEM_NUM" />
<id property="activateCode" column="ACTIVATE_CODE" />
<id property="cardNo" column="CARD_NO" />
<id property="cardLevel" column="CARD_LEVEL" />
<id property="memberType" column="MEM_TYPE" />
<id property="memberHierarchy" column="MEM_TIER" />
<id property="registerSource" column="ENROLL_CHANNEL" />
<id property="registerDate" column="ENROLL_DATE" />
<id property="remindQuestion" column="QUESTION" />
<id property="remindAnswer" column="ANSWER" />
<id property="status" column="STATUS" />
<id property="email" column="EMAIL" />
<id property="cellPhone" column="PHONE" />
<id property="password" column="PASSWORD" />
<id property="lastUpd" column="LAST_UPD"/>
<id property="newMemberHierarchy" column="NEW_MEM_TIER" />
<id property="identityType" column="IDENTITY_TYPE" />
<id property="identityNo" column="IDENTITY_NO" />
<id property="title" column="TITLE" />
<id property="mcMemberCode" column="MC_MEMBER_CODE" />
<id property="thirdpartyType" column="THIRDPARTY_TYPE" />
<id property="mCustomerId" column="M_CUSTOMER_ID" />
<collection property="cardList" column="ID" javaType="ArrayList" ofType="memberMemCard" select="queryCardInfoByMemberInfoId" />
<collection property="memberVerfyList" column="ID" javaType="ArrayList" ofType="memberVerfy" select="queryVerifyInfoByInfoId" />
</resultMap>
相关推荐
本篇文章将主要探讨如何使用Ibatis对单个对象进行各种操作,包括插入、更新、删除和查询。我们将通过源码解析和工具使用来深入理解这一过程。 首先,Ibatis的配置文件是整个框架的核心,它定义了数据源、事务管理...
Ibatis 数据表对象自动生成器 自动生成针对配置好的每个表的XML文件和VO(DTO)文件
本文将深入探讨如何在iBATIS中进行主子表查询,以及涉及到的相关技术如一对多关系、日志管理库log4j等。 首先,主子表查询是数据库设计中常见的场景,通常涉及到一个“父”表(主表)和一个或多个“子”表(从表)...
- 使用`EXISTS`子查询通常比直接关联查询更高效,尤其是在数据量大的情况下。 - 避免在`WHERE`子句中使用多个条件或`OR`操作符,而是应该使用`IN`操作符或者`UNION ALL`合并多个查询。 3. Struts、Spring与Ibatis...
ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或注解进行配置,将接口及Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。 #### 二、and与or联合查询基础 在SQL查询中,`AND...
例如,你可能看到如何使用iBatis进行增删改查操作,以及如何处理复杂查询,如联接查询、子查询等。 "iBatis开发指南"则是更全面的官方文档,它包含了iBatis的所有特性和使用方法。从中,你可以学习到动态SQL的使用...
IBATIS允许程序员直接编写原生态SQL,并支持高级映射机制,使得Java对象和数据表之间能够轻松映射,极大地简化了基于SQL的程序的编码工作。 ### 复杂SQL查询解析 #### SQL语句结构分析 提供的SQL查询语句展示了...
- 复杂查询:涉及子查询,联合查询,存储过程的调用等。 - 缓存机制:讲解iBATIS的缓存策略,如何启用和配置缓存以提高性能。 - 异常处理:介绍iBATIS抛出的异常类型及其处理方式。 - 批量操作:如何利用iBATIS...
文档中应该会有实例展示如何利用动态SQL来实现条件查询、聚合函数和子查询等功能。 最后,文档可能还会涉及到iBATIS的高级特性,比如缓存机制,它可以提高数据访问的性能。iBATIS提供了本地缓存和二级缓存两种方式...
当我们谈论“spring+ibatis+jDom递归生成”时,可能是指在Spring应用中,使用iBatis进行数据查询,然后利用jDom解析返回的XML数据,通过递归方法构建复杂的对象树。以下是一种可能的实现方式: 1. 首先,在Spring...
- **对象关系映射(ORM)**:ibatis更多关注SQL查询的映射,而myBatis在此基础上加强了对象关系映射的能力,更好地实现了SQL与Java对象之间的转换。 #### 七、结论 通过对ibatis与myBatis之间区别的详细分析,我们...
在一对多映射中,association 标签用于定义主对象中包含的子对象集合。 4. **collection** 标签:这是 iBatis 用于表示一对多关系的主要标签。它定义了主对象中的集合属性,如 List 或 Set,以及如何从查询结果中...
1. **复杂查询**:当需要进行复杂的数据库查询,如分页、联合查询、子查询时,IBatis 提供的 SQL 映射和动态 SQL 功能非常有用。 2. **性能优化**:通过缓存机制,可以减少对数据库的频繁访问,提高系统性能。 3. ...
学习如何编写这些文件,包括INSERT、UPDATE、DELETE和SELECT语句,以及如何处理复杂的查询,如联接、子查询等。 3. **Mapper接口与XML配置**:iBATIS支持通过Java接口定义SQL操作,然后在XML文件中实现这些操作。...
- **定义**:ibatis是一个开源的持久层框架,它简化了Java应用程序与数据库之间的交互过程,但相较于其他如Hibernate这样的“一站式”ORM解决方案,ibatis更加侧重于SQL语句的手动编写和SQL与Java对象之间的映射配置...
iBatis是由Clinton Begin创建的一个开源项目,最初是Apache基金会的子项目,后来转为MyBatis。它的主要功能包括:动态SQL、映射文件解析、事务管理等。通过XML或注解方式配置SQL语句,实现了SQL与Java代码的解耦,...
描述中提到的几个版本和子项目,包括mybatis3.0.5、ibatis-core-3.0、ibatis-core-3.0-sources、ibatis-dao-2、ibatis-sqlmap-2,这些是iBATIS不同版本和组件的标识: 1. mybatis3.0.5:这是MyBatis的3.0.5版本,...
对应于`selectOrdersByUserId`,你需要编写一个SQL查询,它将根据父对象的主键值(这里是`user_id`)来获取子对象。 ```xml SELECT * FROM orders WHERE user_id = #{userId} ``` **多对多关系映射** 多对多...
Ibatis,作为一款轻量级的Java持久层框架,虽然功能强大,但在默认情况下,其分页方式是逻辑分页,即先查询所有数据,然后在应用程序层面进行分页处理,这种方式对于大数据量的查询来说,无疑会消耗大量的内存和CPU...