Mybatis复杂查询结果映射之collection

如若看不懂可查看官网文档
https://mybatis.net.cn/sqlmap-xml.html#Result_Maps
方式一:查一次

<resultMap id="inLeaseMap" type="cfContract">
        <result property="id" column="id"/>
        <result property="contractSn" column="contract_Sn"/>
        <result property="recordSn" column="record_sn"/>
        <collection property="customerList" ofType="实体类" javaType="ArrayList" resultMap="customerMap"/>
        //list对象
    </resultMap>

//list对象的映射关系

<resultMap id="customerMap" type="cfCustomer">
        <result property="id" column="cu_id"/>
        <result property="customerSn" column="customer_sn"/>
        <result property="customerType" column="customer_type"/>
        <result property="customerName" column="customer_name"/>
        <result property="customerStar" column="customer_star"/>
        <result property="identityCard" column="identity_card"/>
        <result property="contactName" column="contact_name"/>
    </resultMap>

//mybatis会自动归集结果,比如说有两条合同信息,但是是同一份合同有两个客户信息
则mybatis会处理数据结构为
{
//合同信息
id:
contract_sn:
customerList:[
{//客户1信息},{//客户2信息}
]
}

 <select  id="inLeaseList" resultMap="inLeaseMap">
        select
            c.id,
            cu.id as c_id,
            c.contract_sn,
            cu.customer_sn, cu.customer_type, cu.customer_name, cu.customer_star, cu.identity_card, cu.contact_name
        from cf_contract as c left join cf_contract_customer as cc on c.id = cc.contract_id
                              left join cf_customer as cu on cc.customer_id = cu.id
    </select>

方式二: 指定子查询sql 将inLeaseList返回的id字段作为参数传入CustomerListByContract查询
并将CustomerListByContract查询结果集作为list放入inLeaseMap中的customerList内 查两次

合同信息映射

<resultMap id="inLeaseMap" type="cfContract">
        <result property="id" column="id"/>
        <result property="contractSn" column="contract_Sn"/>
        <result property="recordSn" column="record_sn"/>
        <collection property="customerList" javaType="ArrayList" column="id" select="CustomerListByContract" ofType="CfCustomer"/>
    </resultMap>

客户信息映射

<resultMap id="customerMap" type="cfCustomer">
        <result property="id" column="id"/>
        <result property="customerSn" column="customer_sn"/>
        <result property="customerType" column="customer_type"/>
        <result property="customerName" column="customer_name"/>
        <result property="customerStar" column="customer_star"/>
        <result property="identityCard" column="identity_card"/>
        <result property="contactName" column="contact_name"/>
    </resultMap>

主查询 查出合同信息

  <select id="inLeaseList" resultMap="inLeaseMap">
        select *
        from cf_contract
    </select>

子查询 查出合同信息对应的客户信息

select cc.customer_sn, cc.customer_type, cc.customer_name, cc.customer_star, cc.identity_card, cc.contact_name
from cf_contract_customer as c
left join cf_customer as cc on c.customer_id = cc.id
where c.contract_id = #{id}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis支持通过结果集映射来解决复杂SQL查询结果的映射问题。如果查询结果集是多表联合查询的情况,需要进行结果集映射,可以使用MyBatis提供的嵌套查询或者嵌套结果映射。 下面以两个表的联合查询为例,介绍MyBatis如何进行结果集映射: 首先,我们假设有两个表:user和order。 user表的结构如下: ``` CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` order表的结构如下: ``` CREATE TABLE `order` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `order_no` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 其中,order表的user_id字段与user表的id字段相关联。 接下来,我们需要进行两个表的联合查询,并将查询结果映射到一个Java对象中。Java对象的结构如下: ``` public class UserOrder { private int id; private String name; private int age; private List<Order> orders; // getter、setter方法 } ``` UserOrder对象包含了user表和order表的字段信息,并且使用List类型的orders属性来保存order表的相关信息。 在MyBatis的Mapper文件中,我们可以使用嵌套查询来实现两个表的联合查询,并将查询结果映射到UserOrder对象中,具体实现如下: ``` <select id="getUserOrder" resultMap="userOrderMap"> SELECT u.id, u.name, u.age, o.id as order_id, o.order_no FROM user u LEFT JOIN order o ON u.id = o.user_id WHERE u.id = #{id} </select> <resultMap id="userOrderMap" type="UserOrder"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> <collection property="orders" ofType="Order"> <id column="order_id" property="id"/> <result column="order_no" property="orderNo"/> </collection> </resultMap> ``` 在getUserOrder查询语句中,我们使用了LEFT JOIN关键字来进行两个表的联合查询,并使用了WHERE子句来指定查询条件。在resultMap中,我们使用了collection标签来映射orders属性,并使用了ofType属性来指定orders集合元素的类型为Order对象。 需要注意的是,在resultMap中使用collection标签来映射orders属性时,需要使用id标签来映射order表的主键,使用result标签来映射order表的其他字段信息。 最后,我们通过调用session.selectOne方法来执行getUserOrder查询语句,并将查询结果映射到UserOrder对象中: ``` UserOrder userOrder = session.selectOne("getUserOrder", 1); ``` 以上就是在MyBatis中进行复杂结果集映射的方法。通过使用嵌套查询或嵌套结果映射,可以轻松地实现多表联合查询,并将查询结果映射到Java对象中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值