springboot使用mybatis一对多的关联查询问题记录
作者:__莫等闲 发布时间:2023-05-25 14:31:03
标签:springboot,mybatis,关联查询,一对多
springboot使用mybatis一对多的关联查询
由于刚开始写java不久,对sql语句的熟悉度还是不够熟练,虽然现在使用的mybatisPlus比较多,但我始终觉得sql不能忘也不能不用,刚好最近有个需求需要做到关联的查询,时间也算充足,所以用sql来写,于是踩了很久坑,终于跳出来了,小小记录一下。
一对多
# 我这里是一对多查询,一张主表两张副表,最后还要有一张VO表(就是做关联映射用的),主表和副表的实体我就不贴了,以下是VO实体
这是我的controller
@RequestMapping(value = "/queryChartAll", method = RequestMethod.GET)
public R<?> queryChartAll(){
List<StatementEnteringVO> statementEnteringVO = statementEnteringMapper.queruMapperPage();
if(statementEnteringVO != null){
return R.data(statementEnteringVO);
}else{
return R.fail(ResultCode.ERROR);
}
}
mapper
public interface StatementEnteringMapper extends BaseMapper<StatementEntering> {
List<StatementEnteringVO> queruMapperPage();
}
mapper.xml(注意了,最难受也是最坑的)
为了展示方便,我贴少点的字段,不然老长的代码看球不明白,再注一下:一对多使用collection
,一对一使用association
,文章主讲一对多的。所以也不对association
做解释了,感兴趣的朋友可以自己去了解一下,用法是一样的。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ld.ldstat.mapper.StatementEnteringMapper">
<resultMap id="queryChartAllTwo" type="com.ld.ldstat.vo.StatementEnteringVO">
<id property="id" jdbcType="BIGINT" column="sid"></id>
<result property="theDate" jdbcType="DATE" column="the_date"></result>
<result property="deptName" jdbcType="VARCHAR" column="dept_name"></result>
<result property="deptId" jdbcType="BIGINT" column="dept_id"></result>
<!--这里是对应vo实体的表1实体-->
<collection property="cashCar" javaType="java.util.List" ofType="com.ld.ldstat.entity.CashCar">
<id property="id" jdbcType="BIGINT" column="cid"></id>
<result property="parentId" jdbcType="BIGINT" column="c_parent_id"/>
<result property="projectName" jdbcType="VARCHAR" column="c_project_name"/>
<result property="ninetyWithin" jdbcType="INTEGER" column="ninety_within"/>
<result property="ninetyExcept" jdbcType="INTEGER" column="ninety_except"/>
<result property="cashCar" jdbcType="INTEGER" column="cash_car"/>
</collection>
<!--这里是对应vo实体的表2实体-->
<collection property="subtotalAll" ofType="com.ld.ldstat.entity.SubtotalAll">
<id property="id" jdbcType="BIGINT" column="aid"></id>
<result property="parentId" jdbcType="BIGINT" column="a_parent_id"/>
<result property="projectName" jdbcType="VARCHAR" column="a_project_name"/>
<result property="subtotalType" jdbcType="INTEGER" column="subtotal_type"/>
<result property="task" jdbcType="INTEGER" column="task"/>
<result property="theDay" jdbcType="INTEGER" column="the_day"/>
</collection>
</resultMap>
<select id="queruMapperPage" resultMap="queryChartAllTwo">
SELECT
se.id sid,se.the_date,se.dept_name,
ca.id cid,ca.project_name c_project_name,ca.parent_id c_parent_id,ca.ninety_Within,ca.ninety_except,ca.cash_car,
sa.id aid,sa.project_name a_project_name,sa.parent_id a_parent_id,sa.task,sa.the_day
FROM
statement_entering se
LEFT JOIN cash_car ca on se.id = ca.parent_id
LEFT JOIN subtotal_all sa on se.id = sa.parent_id
<!-- 条件可根据自己的需求增加啦-->
</select>
</mapper>
以下是需要注意的点(我就是在这里踩了好久的坑)
以下sql用的是左连接语句LEFT JOIN
,具体的sql语句我也不解释了,因为要了解的太多了,【尴尬】
这里的这些字段必须要使用别名,为啥?因为几张表的字段相同所以会出现覆盖的问题,比如我副表1和副表2同时存在一个相同字段project_name
,如果不给其声明别名,副表2该字段的数据会被副表1的该字段覆盖掉,原理我也解释不清楚,哈哈!!
对应的映射字段要使用别名,上图
线划的丑了些,将就吧!
看下最终获取到的数据结构
完美,理想中的效果。。。
至于最终效果图为啥这么多null
,不用怀疑,这些是我没有写对应的映射
来源:https://blog.csdn.net/qq_31676725/article/details/122674040


猜你喜欢
- Dockerfile 构建java web 环境Dockfile 介绍:Dockfile是一种被Docker程序解释的脚本,Dockerfi
- XML作为一种业界公认的数据交换格式,在各个平台与语言之上,都有广泛使用和实现。其标准型,可靠性,安全性......毋庸置疑。在androi
- 概述工作电脑用了3年多了,100G的C盘也快吃不消了,每次打开看到C盘红了,总要用清理工具清理一下子.不知道怎么最近清理工具清理
- 本文实例为大家分享了C#实现简单的计算器小功能的具体代码,供大家参考,具体内容如下先来张效果图吧(5分钟写好,莫怪)代码:数字按钮绑定的是b
- 开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单、第二步生成微信支付参数、第三步调起微信APP支付。除了需要审
- 本文实例为大家分享了Android实现简单banner轮播图的具体代码,供大家参考,具体内容如下说明:想玩一个简单的轮播图效果
- 本文实例为大家分享了C#强制转换和尝试转换的方法,供大家参考,具体内容如下将String[]类型的Object类型,转换为String[]类
- Android USB转串口通信开发实例详解好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平
- 前言:创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法
- 普通校验导入依赖:默认的报错:没有提示具体的属性设置自己的错误信息提示:创建 ValidationMessages.properties内容
- 简介本文用示例介绍java的Period的用法。Duration和Period说明Duration类通过秒和纳秒相结合来描述一个时间量,最高
- jedis是redis的java客户端,spring将redis连接池作为一个bean配置。redis连接池分为两种,一种是“redis.c
- 介绍MVC(Model-View-Controller)是一种软件架构模式,其中应用程序被划分为三个部分:模型(Model)、视图(View
- Starting创建手势密码可以查看 CreateGestureActivity.java 文件.登陆验证手势密码可以看 GestureLo
- 问题引出:最近开了新项目,项目中用到了数据字典,列表查询数据返回的时候需要手动将code转换为name,到前台展示。项目经理表示可以封装一个
- 前言:在Java面试中,线程的状态也是被经常考察的知识点,今天我们就来聊一聊线程状态的那些事!线程在JVM中的状态查看线程在JVM中有哪些不
- 上一篇文章讲解了Spring Cloud 整合 nacos 实现服务注册与发现,nacos除了有服务注册与发现的功能,还有提供动态配置服务的
- java加载properties文件的六种方法总结java加载properties文件的六中基本方式实现java加载properties文件
- synchronized锁的升级(偏向锁、轻量级锁及重量级锁)java同步锁前置知识点1.编码中如果使用锁可以使用synchronized关
- 在使用C#进行相关编程的时候,有时候我们需要获取系统相关的进程信息。那么在C#中如何获取系统的所有进程那?下面请跟小编一起来操作。1、首先新