写在前面

今天使用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字段的更多相关文章

  1. MyBatis联表查询

    MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...

  2. Mybatis多表查询之一对一查询的多种实现-XML配置

    Mybatis 中对于多表查询提供了非常强大的实现方式,主要是通过resultMap的结果映射对于多表查询后的返回值进行封装,让我们来看一下官网上对于resultMap的解释:resultMap 元素 ...

  3. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...

  4. MyBatis 多表查询

    1.多表设计 多表查询 a.多表设计 (1)一对一 在任意一方设计外键保存另一张表的主键,维系表和表的关系 (2)一对多 在多的一方设计外键保存一的一方的主键,维系表和表的关系 (3)多对多 设计一张 ...

  5. mybatis 关联表查询

    这段时间由于项目上的需求:需要将数据库中两表关联的数据查询出来展示到前端(包含一对一,一对多): (1)一对一: 在实体类中维护了另一个类的对象: 这里我以用户(User)和产品(Product)为例 ...

  6. mybatis 联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  7. mybatis 多表查询sql

    在使用spring,spring mvc,mybatis时,mybatis链接数据库做多表查询的时候,sql语句中直接使用left join等链接字符就可以 链接多个表,参数类型是parameterT ...

  8. mybatis多表查询之多对多关系查询的实现-xml方式

    Mybatis对于多对多关系下的查询提供了集合(collection)的概念来解决,collection属性是resultMap高级结果映射的子集,首先,在本例中我们使用的是集合元素来解决多对多的查询 ...

  9. MyBatis联表查询——别名方式

    在使用MyBatis你想工程时,单表操作其实是非常完美的,涉及到多表联合查询时,需要我们自己写联表的SQL语句. 我拿出项目中的部分代码作为示例, EmployeeMapper.xml: <?x ...

随机推荐

  1. linux下编译安装php5.6出现 configure: error: Cannot find MySQL header files under /usr/local/mysql.

    #yum install gcc gcc-c++ libxml2 libxml2-devel libjpeg-devel libpng-devel freetype-devel openssl-dev ...

  2. C/C++读取SEGY文件(三)

    SEGY IO (IBM&PC) 本文档将介绍SEGY的读取与写入过程,其中包括IBM与PC两种数据格式的转换. 程序将调用IEEE2IBM.cpp文件完成IBM与PC格式的互相转换. 新建头 ...

  3. SQL常用数据类型 字段约束

    SQL中的常用数据类型: 整数:int 小数:double 字符串:varchar(长度),建议 用2的整数倍 日期:date 格式: 'YYYY-MM-DD' SQL中的约束: a.主键约束:pri ...

  4. .Net6 设置环境变量

    开发过程中经常要发布一个版本到测试服上给测试人员测试,可能需要直接输出错误信息,需要设置环境变量为Development,如果是IIS可以通过设置IIS环境变量,见下面这篇文章 https://blo ...

  5. CVE-2018-12613phpMyAdmin 后台文件包含漏洞分析

    一.    漏洞背景 phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库.借由此Web接口可以成 ...

  6. 2.4 C++STL deque容器详解

    文章目录 2.4.1 引入 2.4.2 代码示例 2.4.3 代码运行结果 2.4.4 具体案例 总结 2.4.1 引入 deque容器类比vector容器来学习. deque为双向开口容器,见下图. ...

  7. ElasticSearch7.3 学习之倒排索引揭秘及初识分词器(Analyzer)

    一.倒排索引 1. 构建倒排索引 例如说有下面两个句子doc1,doc2 doc1:I really liked my small dogs, and I think my mom also like ...

  8. OAuth2和JWT - 如何设计安全的API?

    JWT和OAuth2比较? 要比较JWT和OAuth2?首先要明白一点就是,这两个根本没有可比性,是两个完全不同的东西. JWT是一种认证协议        JWT提供了一种用于发布接入令牌(Acce ...

  9. k8s.gcr.io、gcr.io仓库的镜像下载

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 获取这类镜像的方法一般有2种: 1.通过拉取国内镜像仓库的内容(操作简单直接拉取即可,缺点是镜像的版本更新可能较慢,可能无法获取最新的镜像) 2 ...

  10. ubuntu 16.04 设置root用户初始密码

    安装ubuntu成功后,都是普通用户权限,并没有最高root权限,如果需要使用root权限的时候,通常都会在命令前面加上 sudo .有的时候感觉很麻烦- 我们一般使用su命令来直接切换到root用户 ...