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属性中使用第一张表的主键并以表名.属性的形式进行约束。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgakffe
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01