关于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属性中使用第一张表的主键并以表名.属性的形式进行约束。

posted @   昊月光华  阅读(426)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2022-03-22 关于java连接数据库的步骤和注意事项
2022-03-22 蓝桥杯单片机第五届赛题源码
2022-03-22 蓝桥杯单片机第十二届第二批赛题源码
点击右上角即可分享
微信分享提示