MyBatis封装对象内的List出现的问题
本篇文章问题1:wife的复数形式是wives,不是wifes,英语不好请见谅。
对象举例:
class User {
private String username;
private List<Wife> wifes;
}
class Wife {
}
1. 问题
封装出的List长度数据不正确
比如wifes数据应该有两条,但是查询出来只有一条
2. 原因
由于使用Mybatis-plus的分页
<resultMap id="BaseResultMap" type="com.xj.groupbuy.entity.User">
<id column="user_id" property="userId" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="UserWithWifes" type="com.xj.groupbuy.entity.User" extends="BaseResultMap">
<collection property="wifes" ofType="com.xj.groupbuy.entity.Wife">
<id column="wife_id" property="wifeId"/>
<result column="name" property="wifeName"/>
</collection>
</resultMap>
sql:
<select id="getAllUser" resultMap="UserWithWifes">
select
u.user_id,
u.username,
r.`wife_id` as wifeId,
r.`name` as wifeName
from `user` u
left join `wife` w on w.`husband_id`=u.`user_id`
</select>
如果采用collection封装的话
此时还是会查询出所有的数据
例如:
userId | username | wifeId | wifeName |
---|---|---|---|
1 | username | 1 | wifeName1 |
1 | username | 2 | wifeName2 |
1 | username | 3 | wifeName3 |
此时!如果分页,分一页两条数据的话就会将这三行数据分割开
导致封装出的List长度数据不正确
那么有观众可能会问了,那么会不会出现封装出两个一样的User呢
一个是user:{[wifeName1],[wifeName1 ]},一个是user{[wifeName3]}
答案是不会的,因为mybatis-plus最分页的时候会查询一次count来作为分页的依据
在执行这个sql的时候会计算一次count(*) from user,得到的结果是1,只有1个userId=1的数据
所以以上就会得出一个user:{[wifeName1],[wifeName1 ]},第三个wife就找不到了
3. 解决方法:子查询
1. 需要添加一个Wife对象的resultMap
直接使用Type会封装不上,有知道原因的可以评论区告诉小编哦
<resultMap id="BaseResultMap" type="com.xj.groupbuy.entity.User">
<id column="user_id" property="userId" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="WifeMap" type="com.xj.groupbuy.entity.Wife">
<id column="wife_id" property="wifeId"/>
<result column="name" property="wifeName"/>
</resultMap>
<resultMap id="UserWithWifes" type="com.xj.groupbuy.entity.User" extends="BaseResultMap">
<collection property="wifes" column="user_id" ofType="com.xj.groupbuy.entity.Wife" select="selectUserWifes">
<id column="wife_id" property="wifeId"/>
<result column="name" property="wifeName"/>
</collection>
</resultMap>
2. sql
<!-- 这里是子查询 -->
<select id="selectUserWifes" resultMap="WifeMap">
select
w.`wife_id`,
w.`name`
from `wife` w
where w.`husband_id`=#{user_id}
</select>
<select id="getAllUser" resultMap="UserWithWifes">
select
u.user_id,
u.username
from `user` u
</select>
此时分页的时候,分页操作只会作用在User上,而对Wife没有影响
3. sql解析
首先在mapper调用getAllUser后,会分页查询用户表,
当查询到第一个用户username时将其封装到UserWithWifes,
封装到wifes字段时,去执行子查询找到selectUserWifes方法,
然后根据column对应的user_id去做where查询,并把查询的结果封装成一个List,
最后将封装完成的List 封装到 UserWithWifes的wifes中,之后再查询到第二个用户username2,继续。。。
4. 测试
123
如果喜欢这篇文章的话,给小编点个大大的点赞好嘛
MyBatis封装对象内的List出现的问题的更多相关文章
- day17-Python运维开发基础(类的封装 / 对象和类的相关操作、构造方法)
1. 类的封装及相关操作 # ### oop 面向对象程序开发 """ #用几大特征表达一类事物称为一个类,类更像是一张图纸,表达的是一个抽象概念 "" ...
- text-overflow 与 word-wrap:设置使用一个省略标记...标示对象内文本的溢出。
text-overflow 与 word-wrap text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时 ...
- java中基本类型封装对象所占内存的大小(转)
这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...
- Mybatis增加对象属性不增加mapper.xml的情况
Mybatis增加对象属性不增加mapper.xml的情况: 只增加Model 对象的属性,在查询语句中返回相同名称的字段,但是在mapper中的 resultMap上面不进行新增字段的增加,查询结果 ...
- 双层嵌套json字符串(即json对象内嵌json数组)解析为Map
之前我层写过一篇文章,介绍了json与map的相互转化,但当时只涉及到单一的json对象或json数组,对json对象内嵌套这json数组的json字符串无法处理,这篇文章主要解决这个问题. 之前的那 ...
- dbutils封装对象,单列,一行一列(用)
基本用法:查找并封装对象与对象集合 public User findUserByNamePassword(String name,String password){ QueryRunner runne ...
- vue watch关于对象内的属性监听
vue可以通过watch监听data内数据的变化.通常写法是: data: { a: 100 }, watch: { a(newval, oldVal) { // 做点什么... console.lo ...
- javascript jquery封装对象时的错误,求解!我想知道为什么
jquery 封装对象时的错误 --------------------------------------------<input id="name" name=&qu ...
- mybatis新增对象自动生成uuid方案
mybatis新增对象时, 使用拦截器自动生成uuid方案有了它不再去xml中手动添加selectKey了, 生成id方案实现类自行实现, 实现IdGenerator接口便可, 主要代码由公司同事编写 ...
随机推荐
- SpringCloud 商品架构例子(一)
架构演进和分布式系统基础知识 1.传统架构演进到分布式架构 简介:讲解单机应用和分布式应用架构演进基础知识 高可用 LVS+keepalive 单体应用: 集群: 微服务架构: 1.单体应用: 开发速 ...
- MongoDB学习笔记三 - MongooseAPI操作数据
在上一篇我们讲了如何通过Mongoose想数据库动态添加数据, 接下来我们一起来看一下如何通过Mongoose来对数据库进行增删改查等一系列操作 Model 对象的方法 remove(cinditio ...
- Flink API
一.Flink API 1.DataSet:对静态数据进行批处理操作.将静态数据抽象成分布式数据集,使用Flink各种操作符处理数据,支持 Java .Scala.Python 2.DataStrea ...
- kubebuilder实战之五:operator编码
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- LVS本地实验环境搭建
文中实验需要使用以下软件: CentOS的镜像 Virtual Box GNS3 0.实验前的准备工作 0.1.修改yum源 为了方便安装软件,我们设置yum源为公司yum源 1.直接复制公司机器上的 ...
- IT项目经理-成长手记学习笔记
无论多难,都要记住一点,只要别人不赶你走,你就厚着脸皮待下去,这样你才有可能熬到项目成功. 项目经理要管事,更要管人. 项目计划->职责分工->确定项目范围 遇事及时处理,当场处理,处理错 ...
- BUU-CTF[CISCN2019 华东南赛区]Web11
BUU-CTF[CISCN2019 华东南赛区]Web11 页面最下端有提示Build with Smarty ! 确定页面使用的是Smarty模板引擎.输入{$smarty.version}就可以看 ...
- 10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#)
前言 NuGet就是一个包(package)管理平台,确切的说是 .net平台的包管理工具,它提供了一系列客户端用于生成,上传和使用包(package),以及一个用于存储所有包的中心库. 对于一个现代 ...
- react + layui 坑总结
与react 结合的时候,layui 是纯dom操作,而react是虚拟dom ,二者的结合难免会出现诸多问题. 1 select 下拉框 默认值的修改要通过defaultValue 属性来修改,并且 ...
- Linux/CentOS基础命令1
一.系统相关运行命令1.系统关机命令:shutdown# shutdown 关机 Shutdown scheduled for Fri 2019-03-29 11:36:45 CST, use 'sh ...