Mybatis多表查询出现null字段
写在前面
今天使用mybatis实现多表查询,记录一下其中遇到的坑
mybatis多表查询简介
mybatis多表查询主要有两个方式,通俗易懂的来说就是一个是查询少量属性(association),一个是把多个结果封装成list(collection),我现在对mybatis的理解害不是很深入,用大白话的方法给大家分享一下我的理解。
association用法
association用法很简单,我贴一段代码
<mapper namespace="com.example.springbootvue.mapper.UserMapper">
<resultMap id="UserMap" type="com.example.springbootvue.entity.User">
<id column="user_id" jdbcType="INTEGER" property="userId"/>
<result column="username" jdbcType="VARCHAR" property="username"/>
<result column="role_id" jdbcType="INTEGER" property="roleId"/>
<association property="roleName" column="role_id"
select="com.example.springbootvue.mapper.UserMapper.getRoleName">
</association>
<select id="getRoleName" resultType="java.lang.String" parameterType="integer">
select role_name
from sp_role
where role_id = #{value}
</select>
这个resultMap被我简化过,方便大家观看,这里resultMap指向的是我的User类,我在User类中定义了roleId,这是Role类中的主键,这个实例的目的主要是查询用户和用户的角色
在association中,roleName是User类中的外键,colum是传入getRoleName方法中的参数,没有仔细查询资料,感觉association像回调函数,先找到User,再通过User中的role_id去Role表中查询role_name,事实上好像也真是这样,我debug中mybatis确实像数据库发起了两次请求
2021-05-13 23:22:30.499 INFO 4576 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2021-05-13 23:22:31.305 INFO 4576 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2021-05-13 23:22:31.315 DEBUG 4576 --- [ main] c.e.s.m.UserMapper.selectByPrimaryKey : ==> Preparing: select user_id , username, qq_open_id, `password`, user_email, user_email_code, is_active, user_sex, user_qq, user_tel, user_xueli, user_hobby, user_introduce, create_time, update_time,role_id from sp_user where user_id = ?
2021-05-13 23:22:31.345 DEBUG 4576 --- [ main] c.e.s.m.UserMapper.selectByPrimaryKey : ==> Parameters: 1(Integer)
2021-05-13 23:22:31.372 DEBUG 4576 --- [ main] c.e.s.mapper.UserMapper.getRoleName : ====> Preparing: select role_name from sp_role where role_id = ?
2021-05-13 23:22:31.373 DEBUG 4576 --- [ main] c.e.s.mapper.UserMapper.getRoleName : ====> Parameters: 31(Integer)
2021-05-13 23:22:31.375 DEBUG 4576 --- [ main] c.e.s.mapper.UserMapper.getRoleName : <==== Total: 1
2021-05-13 23:22:31.379 DEBUG 4576 --- [ main] c.e.s.m.UserMapper.selectByPrimaryKey : <== Total: 1
实锤!!
查询字段有null的解决方案
如果查询出来有字段是null,检查一下sql标签中的colum
<sql id="Base_Column_List">
user_id
, username, qq_open_id, `password`, user_email, user_email_code, is_active,
user_sex, user_qq, user_tel, user_xueli, user_hobby, user_introduce, create_time,
update_time,role_id
</sql>
这个xml是我用mybatis-generate生成的,检查一下里面的字段是否都对应了数据库中的colum,我之前roleName一直查询不出来,就是因为我漏掉的role_id,导致我查询出来的user中role_id是null,
在association中的select中的方法
select中的方法最好是加上路径(com.xxx.xxx.xxx.xxxMapper.xxx),检查方法中的形参是否正确(反正我在这里给自己挖坑了,大家这么聪明应该不会在这里掉下去)
collection
colletion是我实现多级菜单查询用到的,还是先上代码
<resultMap id="menuMap" type="com.example.springbootvue.entity.Menu">
<id column="ps_id" jdbcType="SMALLINT" property="psId"/>
<result column="ps_name" jdbcType="VARCHAR" property="psName"/>
<result column="ps_pid" jdbcType="SMALLINT" property="psPid"/>
<collection property="children" ofType="com.example.springbootvue.entity.Menu"
column="ps_id" select="findMenuByParentId"/>
</resultMap>
我在Menu类中定义了一个列表List<Menu> children
,所以colection property=‘children’
(colection集合嘛,肯定是list类型)
ofType
指向Menu
这个类(毕竟children是Menu的属性嘛),同样的 column
可以理解为是后面select=‘findMenuByParentId’
的参数
然后不管是菜单有多少级,它都可以给你全部嵌套进去(经典套娃)
缺点就是一次只能查询一个一级菜单(我的一级菜单有五个,只能分五次查询来解决了,大佬有好的建议还请指教)
我是末尾
希望大家的代码永无bug!!!
奥里给。
Mybatis多表查询出现null字段的更多相关文章
- MyBatis联表查询
MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...
- Mybatis多表查询之一对一查询的多种实现-XML配置
Mybatis 中对于多表查询提供了非常强大的实现方式,主要是通过resultMap的结果映射对于多表查询后的返回值进行封装,让我们来看一下官网上对于resultMap的解释:resultMap 元素 ...
- 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)
在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...
- MyBatis 多表查询
1.多表设计 多表查询 a.多表设计 (1)一对一 在任意一方设计外键保存另一张表的主键,维系表和表的关系 (2)一对多 在多的一方设计外键保存一的一方的主键,维系表和表的关系 (3)多对多 设计一张 ...
- mybatis 关联表查询
这段时间由于项目上的需求:需要将数据库中两表关联的数据查询出来展示到前端(包含一对一,一对多): (1)一对一: 在实体类中维护了另一个类的对象: 这里我以用户(User)和产品(Product)为例 ...
- mybatis 联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- mybatis 多表查询sql
在使用spring,spring mvc,mybatis时,mybatis链接数据库做多表查询的时候,sql语句中直接使用left join等链接字符就可以 链接多个表,参数类型是parameterT ...
- mybatis多表查询之多对多关系查询的实现-xml方式
Mybatis对于多对多关系下的查询提供了集合(collection)的概念来解决,collection属性是resultMap高级结果映射的子集,首先,在本例中我们使用的是集合元素来解决多对多的查询 ...
- MyBatis联表查询——别名方式
在使用MyBatis你想工程时,单表操作其实是非常完美的,涉及到多表联合查询时,需要我们自己写联表的SQL语句. 我拿出项目中的部分代码作为示例, EmployeeMapper.xml: <?x ...
随机推荐
- MySQL优化之索引解析
索引的本质 MySQL索引或者说其他关系型数据库的索引的本质就只有一句话,以空间换时间. 索引的作用 索引关系型数据库为了加速对表中行数据检索的(磁盘存储的)数据结构 索引的分类 数据结构上面的分类 ...
- vue 组件间的几种通信方式
Props配置 原理:通过props配置,进行父子组件间的通信,跨父子通信需要其他组件进行过渡. 使用: 传递方在标签中添加传递内容 <Son :newName="name" ...
- Kubernetes系列(一)Pod
作者: LemonNan 原文地址: https://juejin.im/post/6862733649272537102 简单介绍 Pod 在 kubernetes 中是一个非常重要的基本概念, 别 ...
- Fiddler抓包常用功能
通过上一篇文章Fiddler移动端抓包,我们知道了Fiddler抓包原理以及怎样进行移动端抓包,接下来介绍Fiddler中常用的功能. Fiddler中常用的功能如下: 停止抓包 清空会话窗内容 过滤 ...
- .NET6: 开发基于WPF的摩登三维工业软件 (10) - 机器人
基于前文介绍的Ribbon界面.插件化.MVVM模式等内容,我们搭建了一个软件雏形.本文将综合之前的内容在RapidCAX框架中集成Robot组件,实现一个简单的机器人正向模拟模块. 1 目标 基于M ...
- 一文让你明白CPU上下文切换
我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行.当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时 ...
- centos7使用chrony同步阿里云时间
1.yum -y install chrony2.cp /etc/chrony.conf /etc/chrony.conf.bak3.sed -i '/^server/s/^/#/g' /etc/ch ...
- rancher接管已部署的集群
1.选择一台服务器部署rancher服务 docker pull rancher/rancher:v2.5.6 #拉取rancher镜像 docker run --privileged -d -v / ...
- 内网渗透----Token 窃取与利用
0x00 前言 在之前的文章<渗透技巧--程序的降权启动>介绍了使用 SelectMyParent 降权的方法,本质上是通过 token 窃取实现的.这一次将要对 token 窃取和利用做 ...
- 给windows右键添加快捷启动程序
给windows右键添加快捷启动程序 修改点击空白处的右键 运行--redegit 打开注册表 展开第一个H..C..R 找到 Direcory,展开 找到Background 展开 右键shell, ...