关于Mybatis一对多查询以及返回一条记录的经验总结

前人经验

关于一对多返回一条的问题:原因是在于多张表有列名相同的字段、

如果在数据库中使用连接操作(如 INNER JOIN、LEFT JOIN、RIGHT JOIN 等)进行连接时,列名有相同的字段,则在连接结果集中,这些列名相同的字段会被合并为一个字段。合并后的字段将包含两个或多个原始列中的数据,并且需要使用表别名或列别名来进行区分。
如果不使用别名来区分,可能会导致查询结果不正确、数据重复或数据缺失的问题。因此,在进行数据库连接时,正确设置别名是非常重要的。

resultmap结果映射是在sql的执行结果中再次进行映射,根据执行结果的列名与'property'属性进行映射。所以映射的属性必须是sql执行结果中存在的列名!

本次实践和经验总结

我的配置:

mysql数据库中

user表主键为id

user_orders表以userid(user表中的id)做为外键

假设一个用户有多个订单

user类(一对多查询,所以user类持有对order集合的引用。

package demo.Entity;

import java.util.List;

public class user {

    private  String my_name;
    private  int my_age;
    private  String my_email;
    private  int uid;
    private List<order> ordersOfUsers;


    public String getMy_name() {
        return my_name;
    }

    public void setMy_name(String my_name) {
        this.my_name = my_name;
    }

    public int getMy_age() {
        return my_age;
    }

    public void setMy_age(int my_age) {
        this.my_age = my_age;
    }

    public String getMy_email() {
        return my_email;
    }

    public void setMy_email(String my_email) {
        this.my_email = my_email;
    }

    public int getId() {
        return uid;
    }

    public void setId(int id) {
        this.uid = id;
    }

    public List<order> getOrdersOfUsers() {
        return ordersOfUsers;
    }

    public void setOrdersOfUsers(List<order> ordersOfUsers) {
        this.ordersOfUsers = ordersOfUsers;
    }

    @Override
    public String toString() {
        return "user{" +
                "my_name='" + my_name + '\'' +
                ", my_age=" + my_age +
                ", my_email='" + my_email + '\'' +
                ", id=" + uid +
                ", ordersOfUsers=" + ordersOfUsers.toString() +
                '}';
    }
}

resultmap 结果关联映射 在.xml中(通过 user 表left join 左连接 order表)

     <resultMap id="AllOrdersAboutUsers" type="demo.Entity.user">
        <id property="uid" column="id" />
        <result property="my_name" column="name"/>
        <result property="my_age" column="age"/>
        <result property="my_email" column="email"/>
        <collection property="ordersOfUsers" ofType="demo.Entity.order">
            <id  property="userid" column="userid" />
            <result property="goodsname" column="goodsname"/>
            <result property="account" column="accounts"/>
            <result property="orderid" column="orderid"/>
        </collection>


    </resultMap>

    <select id="AllOrdersAboutUser" resultMap="AllOrdersAboutUsers">

        select
        user.*,
        user_orders.*
        from  user  LEFT JOIN   user_orders   ON  user.id=user_orders.userid
        where user.id=0;




    </select>

关注于以下两个框。

第一种情况(user_orders.userid并不在sql的执行结果中,但它是外外键,本质是user.id)

返回结果正确

发现我并没有返回user_orders.userid(外键),但结果正确。

第二种情况(userorders_userid在sql的执行结果中)

返回结果错误:没把多个order对象整合到集合类中.而是返回两个id相同的user对象。

第三种情况:(对比第一种情况)

结果和第二种情况一样

第四种情况:(两表的外键和主键同时存在,第一个框的column可以user.id或user_orders.userid

返回结果正确

以上的四种情况在resultmap的collection标签中,若不是表.属性的名字,则都返回错误的数据

总结:

  1. 第一种情况不在初学者的意料之内

  1. 第二种情况不在初学者的意料之内

  1. 第三种情况不在初学者的意料之内

  1. 第四种情况则都认同。

  1. 所以,当涉及一张表的主机与另一张表的外键进行联立时,若需求需要返回第一张表的主键,则在sql的执行结果中明确要求返回第一张表的主键,同时在<collection>的id属性中使用第一张表的主键并以表名.属性的形式进行约束。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值