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 ...
随机推荐
- CF1534F1题解
首先,对于一个在第 \(i\) 行 \(j\) 列的沙子,如果他开始下降,他能够使哪些沙子下降呢? 很容易得知是第 \(j-1,j,j+1\) 列所有行号不小于 \(i\) 的沙子. 对于沙子 \(u ...
- 报错 ——Error evaluating expression 'id != null id > 0'.
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error qu ...
- python程序unix密码破解
# qianxiao996精心制作 #博客地址:https://blog.csdn.net/qq_36374896 #!/usr/bin/env python #指定这是一个python文件,使用这个 ...
- toppo-1
靶机准备 由于是.vmdk文件,新建一个虚拟机把硬盘移除,在将此vmdk文件添加为新硬盘即. 开机发现给出了ip地址:192.168.164.184,且当前网络模式为NAT 将kali也设置为NAT模 ...
- IDEA的git的拉去提交Java day9
赶鸭子上架,没法子. 新的知识点24号继续学习,今天认真熟悉了以下IDEA,的git代码的提交和拉去,不过拉去下来的项目有些打开的问题有点多,还在继续解决中-- git知识明天一并上传博客.
- C++ cout 数字之间进制的转换
转换一个数变成8进制,则为 cout << oct << x << endl; 转换一个数变为16进制,为 cout << hex << x ...
- Maven项目报错:“No goals have been specified for this build”解决办法
clean install scf:run第一种解决办法:找到pom.xml文件,在<build>标签里面添加如下所示的代码即可.<defaultGoal> compile & ...
- InnoDB中加锁?
InnoDB 实现了两种类型的行锁,共享锁(S)与排他锁(X).然后由于 InnoDB引擎又支持表级锁,所以它内部又有意向共享锁(IS)与意向排他锁(IX).这两种表锁,都是InnoDB内部自动处理, ...
- 什么是 ThreadLocal 变量?
ThreadLocal 是 Java 里一种特殊的变量.每个线程都有一个 ThreadLocal 就是每 个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了.它是为创建代价 高昂的对象获取线程安全 ...
- 数据分析之Numpy的基本操作
Numpy NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 1 创建 ndarray 使 ...