• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Mybatis一对多查询以和返回一条记录的经验

武飞扬头像
昊月光华
帮助1

前人经验

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

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

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

本次实践和经验总结

我的配置:

mysql数据库中

user表主键为id

学新通

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

学新通

假设一个用户有多个订单

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

  1.  
    package demo.Entity;
  2.  
     
  3.  
    import java.util.List;
  4.  
     
  5.  
    public class user {
  6.  
     
  7.  
    private String my_name;
  8.  
    private int my_age;
  9.  
    private String my_email;
  10.  
    private int uid;
  11.  
    private List<order> ordersOfUsers;
  12.  
     
  13.  
     
  14.  
    public String getMy_name() {
  15.  
    return my_name;
  16.  
    }
  17.  
     
  18.  
    public void setMy_name(String my_name) {
  19.  
    this.my_name = my_name;
  20.  
    }
  21.  
     
  22.  
    public int getMy_age() {
  23.  
    return my_age;
  24.  
    }
  25.  
     
  26.  
    public void setMy_age(int my_age) {
  27.  
    this.my_age = my_age;
  28.  
    }
  29.  
     
  30.  
    public String getMy_email() {
  31.  
    return my_email;
  32.  
    }
  33.  
     
  34.  
    public void setMy_email(String my_email) {
  35.  
    this.my_email = my_email;
  36.  
    }
  37.  
     
  38.  
    public int getId() {
  39.  
    return uid;
  40.  
    }
  41.  
     
  42.  
    public void setId(int id) {
  43.  
    this.uid = id;
  44.  
    }
  45.  
     
  46.  
    public List<order> getOrdersOfUsers() {
  47.  
    return ordersOfUsers;
  48.  
    }
  49.  
     
  50.  
    public void setOrdersOfUsers(List<order> ordersOfUsers) {
  51.  
    this.ordersOfUsers = ordersOfUsers;
  52.  
    }
  53.  
     
  54.  
    @Override
  55.  
    public String toString() {
  56.  
    return "user{"
  57.  
    "my_name='" my_name '\''
  58.  
    ", my_age=" my_age
  59.  
    ", my_email='" my_email '\''
  60.  
    ", id=" uid
  61.  
    ", ordersOfUsers=" ordersOfUsers.toString()
  62.  
    '}';
  63.  
    }
  64.  
    }
学新通

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

  1.  
    <resultMap id="AllOrdersAboutUsers" type="demo.Entity.user">
  2.  
    <id property="uid" column="id" />
  3.  
    <result property="my_name" column="name"/>
  4.  
    <result property="my_age" column="age"/>
  5.  
    <result property="my_email" column="email"/>
  6.  
    <collection property="ordersOfUsers" ofType="demo.Entity.order">
  7.  
    <id property="userid" column="userid" />
  8.  
    <result property="goodsname" column="goodsname"/>
  9.  
    <result property="account" column="accounts"/>
  10.  
    <result property="orderid" column="orderid"/>
  11.  
    </collection>
  12.  
     
  13.  
     
  14.  
    </resultMap>
  15.  
     
  16.  
    <select id="AllOrdersAboutUser" resultMap="AllOrdersAboutUsers">
  17.  
     
  18.  
        select
  19.  
    user.*,
  20.  
    user_orders.*
  21.  
    from user LEFT JOIN user_orders ON user.id=user_orders.userid
  22.  
    where user.id=0;
  23.  
     
  24.  
     
  25.  
     
  26.  
     
  27.  
    </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属性中使用第一张表的主键并以表名.属性的形式进行约束。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgakffe
系列文章
更多 icon
同类精品
更多 icon
继续加载