关于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标签中,若不是表.属性的名字,则都返回错误的数据。
总结:
第一种情况不在初学者的意料之内
第二种情况不在初学者的意料之内
第三种情况不在初学者的意料之内
第四种情况则都认同。
所以,当涉及一张表的主机与另一张表的外键进行联立时,若需求需要返回第一张表的主键,则在sql的执行结果中明确要求返回第一张表的主键,同时在<collection>的id属性中使用第一张表的主键并以表名.属性的形式进行约束。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-03-22 关于java连接数据库的步骤和注意事项
2022-03-22 蓝桥杯单片机第五届赛题源码
2022-03-22 蓝桥杯单片机第十二届第二批赛题源码