Ibatis的关联查询和关联结果

参考资料:
ibatis配置多表关联(一对一、一对多、多对多)

部门实体类定义:
部门类

员工实体类定义:
员工实体类

关联查询

sqlMap.xml

<sqlMap namespace="AUDIT_DEPARTMENT">

    <typeAlias alias="auditDepartmentClass" type="com.cmsz.auditvces.system.model.AuditDepartment" />
    <typeAlias alias="userClass" type="com.cmsz.auditvces.system.model.AuditUser" />

    <!-- 基本映射 -->
    <resultMap class="auditDepartmentClass" id="auditDepartmentMap">
        <result property="departmentId" column="DEPARTMENT_ID" jdbcType="VARCHAR" />
        <result property="departmentCoding" column="DEPARTMENT_CODING" jdbcType="VARCHAR" />
        <result property="departmentName" column="DEPARTMENT_NAME" jdbcType="VARCHAR" />
        <result property="createTime" column="CREATE_TIME" jdbcType="VARCHAR" />
        <result property="managerId" column="MANAGER_ID" jdbcType="VARCHAR" />
        <result property="note" column="NOTE" jdbcType="VARCHAR" />
    </resultMap>

    <!-- 仅用于查询时的关联查询 -->
    <resultMap id="queryDepartmentMap" class="auditDepartmentClass" extends="AUDIT_DEPARTMENT.auditDepartmentMap">
        <result property="manager" column="MANAGER_ID" jdbcType="VARCHAR" select="AUDIT_DEPARTMENT.getManagerInfo" />
    </resultMap>

    <resultMap class="userClass" id="auditUserMap">
        <result property="userId" column="USER_ID" jdbcType="VARCHAR"/>
        <result property="userName" column="USER_NAME" jdbcType="VARCHAR"/>
        <result property="staffName" column="STAFF_NAME" jdbcType="VARCHAR"/>
    </resultMap>

    <!-- 根据部门ID查找部门信息 -->
    <select id="getDepartmentByDeptId" parameterClass="java.util.HashMap" resultMap="queryDepartmentMap">
       SELECT <include refid="base_dept_colum"/> FROM AUDIT_DEPARTMENT 
       WHERE 1=1 
       <isNotEmpty prepend=" AND" property="departmentId">
            DEPARTMENT_ID=#departmentId#
       </isNotEmpty>
    </select>

    <!-- 根据经理ID查询 其信息 -->
    <statement id="getManagerInfo" parameterClass="java.lang.String" resultMap="auditUserMap" >
        SELECT USER_ID,USER_NAME,STAFF_NAME FROM AUDIT_USER WHERE USER_ID = #value#
    </statement>
    </sqlMap>

通过API查询结果:

{
    "rspMsg":"查询部门信息成功",
    "rspCode":"",
    "rspDesc":"",
    "isError":true,
    "resultList":[
        {
            "departmentId":"56",
            "departmentCoding":"DA4",
            "departmentName":"销售4部",
            "createTime":"20160415160758",
            "managerId":"4",
            "note":"第4条测试",
            "manager":{
                "userId":"4",
                "userName":"test",
                "staffName":"测试员"
            }
        }
    ]
}

关联结果(优先)

sqlMap.xml

    <!-- 基本映射 -->
    <resultMap class="auditDepartmentClass" id="auditDepartmentMap">
        <result property="departmentId" column="DEPARTMENT_ID" jdbcType="VARCHAR" />
        <result property="departmentCoding" column="DEPARTMENT_CODING" jdbcType="VARCHAR" />
        <result property="departmentName" column="DEPARTMENT_NAME" jdbcType="VARCHAR" />
        <result property="createTime" column="CREATE_TIME" jdbcType="VARCHAR" />
        <result property="managerId" column="MANAGER_ID" jdbcType="VARCHAR" />
        <result property="note" column="NOTE" jdbcType="VARCHAR" />
    </resultMap>

    <!-- 仅用于查询时的关联结果 -->
    <resultMap id="queryDepartmentMap" class="auditDepartmentClass" extends="AUDIT_DEPARTMENT.auditDepartmentMap">
        <result property="manager" resultMap="AUDIT_DEPARTMENT.auditUserMap" />
    </resultMap>

    <resultMap class="userClass" id="auditUserMap">
        <result property="userId" column="USER_ID" jdbcType="VARCHAR"/>
        <result property="userName" column="USER_NAME" jdbcType="VARCHAR"/>
        <result property="staffName" column="STAFF_NAME" jdbcType="VARCHAR"/>
    </resultMap>

    <!-- 根据部门ID查找部门信息 -->
    <select id="getDepartmentByDeptId" parameterClass="java.util.HashMap" resultMap="queryDepartmentMap">
        SELECT A.DEPARTMENT_ID,A.DEPARTMENT_CODING,A.DEPARTMENT_NAME,A.CREATE_TIME,A.MANAGER_ID,A.NOTE,B.USER_ID,B.USER_NAME,B.STAFF_NAME
         FROM AUDIT_DEPARTMENT A left outer join AUDIT_USER B ON(A.MANAGER_ID = B.USER_ID)
       <dynamic prepend=" WHERE ">
           <isNotNull prepend=" AND" property="departmentId">
                A.DEPARTMENT_ID=#departmentId#
           </isNotNull>
       </dynamic>
    </select>

结果:

{
    "rspMsg":"查询部门信息成功",
    "rspCode":"",
    "rspDesc":"",
    "isError":true,
    "resultList":[
        {
            "departmentId":"56",
            "departmentCoding":"DA4",
            "departmentName":"销售4部",
            "createTime":"20160415160758",
            "managerId":"4",
            "note":"第4条测试",
            "manager":{
                "userId":"4",
                "userName":"test",
                "staffName":"测试员"
            }
        }
    ]
}

关联查询时的多参数传递–组合键值或多个复杂参数属性

您可能注意到在上面的例子中, resultMap 的 column 属性只指定了一个键值。 这意味着
只有一个字段和相关的 mapped statement 关联。 但是, 还有一种语法能把多个字段传给相关
的 mapped statement。当对象之间的关系存在组合键值关系,或只是简单地使用一个其他名
称而不是#value#的属性时, 它就能派上用场了。 这种关于 column 属性的语法很简单, 写成
{param1=column1, param2=column2, …, paramN=columnN}。考虑下面的例子,其中
PAYMENT 表的主键是 CustomerID 和 OrderID:

<resultMap id=”get-order-result” class=”com.ibatis.example.Order”>
<result property=”id” column=”ORD_ID”/>
<result property=”customerId” column=”ORD_CST_ID”/><result property=”payments” column=”{itemId=ORD_ID, custId=ORD_CST_ID}”
select= getOrderPayments”/>
</resultMap>
<statement id=”getOrderPayments” resultMap=”get-payment-result”>
select * from PAYMENT
where PAY_ORD_ID = #itemId#
and PAY_CST_ID = #custId#
</statement>

**只要字段的次序和 statement 参数的次序相同,您也可以只指定字段名称。例如:
{ORD_ID, ORD_CST_ID}**
但通常这样做会对性能有轻微的影响,并影响到可读性和可维护性。
重要提示!目前 SQL Map 架构无法自动解决 resultMap 之间的双向关系。 这在处理 “父
/子” 双向关系的 resultMap 时尤其要注意。一个简单的办法是,为其中一种情况再定义一
个不装入父对象的 resultMap(反之亦然)。
注意! 某些 JDBC Driver(如嵌入式 PointBase) 不支持同时打开多个 ResultSet。这些
Driver 支持复杂类型映射,因为 SQL Map 引擎要求同时打开多个 ResultSet。
注意! Result Map 的名称是局部的, 只在定义它的 SQL Map XML 文件中有效。 如果要
在别的 QL Map XML 文件引用它,需要在 Result Map 名称前加上 SQL Map 的名称(在
根元素中定义的名称)作为前缀。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值