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,不用怀疑,这些是我没有写对应的映射

到此这篇关于springboot使用mybatis一对多的关联查询的文章就介绍到这了,更多相关springboot使用mybatis关联查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot整合mybatis实现简单的一对多级联查询功能

    本文的目的是用springboot整合mybatis实现一个简单的一对多查询.(查询一个用户有多少件衣服) 第一步:数据库中,可以直接在navicat中建立两张我们需要用到的表 users DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(0) NOT NULL AUTO_INCREMENT, `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_

  • springboot整合mybatis-plus基于注解实现一对一(一对多)查询功能

    因为目前所用mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能支持单表,没有一对一和一对多关系映射,且该功能还在开发中,相信mybatis-plus开发团队在不久的将来应该会实现此功能. 由于本人开发习惯的原因,实在是太讨厌大量的xml充斥在整个项目中,尤其是表的mapper.xml,虽然有代码生成器可以生成,但是有些复杂的查询还是需要手写配置文件里的动态sql,这点比较反感(至于为什么反感,也是有多方面原因的). 不过可能是大量的java开发人员已经被虐惯了,已

  • springboot使用mybatis一对多的关联查询问题记录

    springboot使用mybatis一对多的关联查询 由于刚开始写java不久,对sql语句的熟悉度还是不够熟练,虽然现在使用的mybatisPlus比较多,但我始终觉得sql不能忘也不能不用,刚好最近有个需求需要做到关联的查询,时间也算充足,所以用sql来写,于是踩了很久坑,终于跳出来了,小小记录一下. 一对多 # 我这里是一对多查询,一张主表两张副表,最后还要有一张VO表(就是做关联映射用的),主表和副表的实体我就不贴了,以下是VO实体 这是我的controller @RequestMap

  • MyBatis中的表关联查询实现示例

    Mybatis中的一对多对象关联查询查询 模拟情景,商品与商品详情:一件商品可以对应多个商品详情信息,即从商品➡商品详情方向看,属于一对多. 在一对多关系中,需要在属于一的一方的实体类中添加多的一方的集合,一般为List<>类型 //(省去了get和set的方法) public class Goods { private Integer goodsId ; private String title ; private String subTitle ; private Float origin

  • Spring boot2基于Mybatis实现多表关联查询

    模拟业务关系: 一个用户user有对应的一个公司company,每个用户有多个账户account. spring boot 2的环境搭建见上文:spring boot 2整合mybatis 一.mysql创表和模拟数据sql CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `company_id` int(11) NOT NULL, PRI

  • SpringBoot JPA 表关联查询实例

    今天给大家介绍一下如何利用JPA实现表关联查询. 今天给大家举一个一对多的关联查询,并且是使用JPA原生的findBy语句实现的. 例子中总共有两个实体类,一个是Floor(商品楼层类),另一个是FloorContent(商品楼层内容表).下面看两张表的源代码: Floor类: package cms.model; import cms.model.base.BaseDomain; import org.hibernate.annotations.GenericGenerator; import

  • Mybatis使用@one和@Many实现一对一及一对多关联查询

    目录 一.准备工作 1.创建springboot项目,项目结构如下 2.添加pom.xml配置信息 3.配置相关信息 二.使用@One注解实现一对一关联查询 三.使用@Many注解实现一对多关联查询 四.FetchType.LAZY 和 FetchType.EAGER的区别 一.准备工作 1.创建springboot项目,项目结构如下 2.添加pom.xml配置信息 <dependencies> <dependency> <groupId>org.mybatis<

  • SpringBoot中Mybatis注解一对多和多对多查询实现示例

    目录 一.模拟的业务查询 二.对应的实体类如下 三.对应的建表语句和模拟数据如下 四.@One一对一映射 五.@Many一对多查询 六.@One @Many的总结 一.模拟的业务查询 系统中的用户user都有唯一对应的地址信息address,每个用户可以有多量车car,类似如下结构 |-- user |-- address |-- carList |-- car1 |-- car2 二.对应的实体类如下 @Data public class AddressPO { private Long id

  • Mybatis 一对多和多对一关联查询问题

    首先  数据库量表之间字段关系(没有主外键) studentmajor表的id字段对应student表里major字段 两个实体类 package com.model; import java.util.Date; public class Student { private Integer sno; private String sname; private String ssex; private Integer sclass; private StudentMajor studentmaj

  • 解决mybatis一对多关联查询多条数据只显示一条的问题

    一对多,如果多个表字段名相同,要记住使用别名,否则多条数据只显示一条 <resultMap type="com.example.demo.model.TuserModel" id="extendMapper"> <id column="id" property="id" /> <result column="user_name" property="userName&

  • Mybatis自关联查询一对多查询的实现示例

    注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-13-oneself-one2many,需要自取,需要配置maven环境以及mysql环境(sql语句在resource下的test.sql中),觉得有用可以点个小星星. docsify文档地址在:https://damaer.github.io/Mybatis-Learning/#/ 所谓自关联查询,是指自己既然充当一方,又充当多方.比如新闻栏目

随机推荐