mybatis嵌套查询的使用[通俗易懂]

mybatis嵌套查询的使用[通俗易懂]当我们遇到表与表之之间存在关联的时候,就可以使用mybatis的嵌套查询比如说当一个对象包含了另一个对象/***公交实体类中包含了司机信息和路线信息*/publicclassBusimplementsSerializable{privateIntegerid;privateStringcard;privateIntegerd…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在使用mybatis时,当我们遇到表与表之之间存在关联的时候,就可以使用嵌套查询
比如说
当一个对象包含了另一个对象

/** * 公交实体类中包含了司机信息和路线信息 */
public class Bus implements Serializable { 
   
    private Integer id;

    private String card;

    private Integer driverid;

    private Integer wayid;

    private Double price;

    private Date topen;

    private Date tclose;

    private Driver driver;//司机

    private Way way;//路线
    //省略封装方法
 }

当一个对象中包含另一个对象的泛型集合

public class Way implements Serializable { 
   
    private Integer id;

    private String name;

    private Date topen;

    private Date tclose;

    private List<Station> stations;

    private String topenString;

    private String tcloseString;
    //省略封装方法
 }

当一个对象中包含了另外一个对象时,在resultMap中就可以使用嵌套查询

<?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.whx.bus.mapper.BusMapper" >
  <resultMap id="BaseResultMap" type="com.whx.bus.entity.Bus" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="card" property="card" jdbcType="VARCHAR" />
    <result column="driverId" property="driverid" jdbcType="INTEGER" />
    <result column="wayId" property="wayid" jdbcType="INTEGER" />
    <result column="price" property="price" jdbcType="DOUBLE" />
    <result column="topen" property="topen" jdbcType="TIMESTAMP" />
    <result column="tclose" property="tclose" jdbcType="TIMESTAMP" />
    <!-- 在select属性中指向需要调用哪个sql执行(可以指向其它命名空间的,比如:com.whx.bus.mapper.WayMapper.selectByPrimaryKey)-->
    <!-- 在column属性中指定需传递给子查询的参数 -->
    <!-- 在property属性中指定Java对象中的变量名 -->
    <!-- 在javaType属性中指定当前对象的限定名(如果是集合的话就是ofType) -->
    <association property="driver" column="driverId" javaType="com.whx.bus.entity.Driver" select="selectDriverById">
    </association>
    <!-- 在select属性中指向需要调用哪个sql执行(可以指向其它命名空间的,比如:com.whx.bus.mapper.WayMapper.selectByPrimaryKey)-->
    <!-- 在column属性中指定需传递给子查询的参数 -->
    <!-- 在property属性中指定Java对象中的变量名 -->
    <!-- 在javaType属性中指定当前对象的限定名(如果是集合的话就是ofType) -->
    <association property="way" column="wayId" javaType="com.whx.bus.entity.Way" select="selectWayById">
    </association>
  </resultMap>
  <!-- 司机结果集 -->
  <resultMap id="DriverResultMap" type="com.whx.bus.entity.Driver">
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="driver_card" property="driverCard" jdbcType="VARCHAR" />
    <result column="mobile" property="mobile" jdbcType="VARCHAR" />
  </resultMap>
  <!-- 路线结果集 -->
  <resultMap id="WayResultMap" type="com.whx.bus.entity.Way">
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="topen" property="topen" jdbcType="TIMESTAMP" />
    <result column="tclose" property="tclose" jdbcType="TIMESTAMP" />
    <result column="topenString" property="topenString" jdbcType="VARCHAR" />
    <result column="tcloseString" property="tcloseString" jdbcType="VARCHAR" />
    <!-- 在select属性中指向需要调用哪个sql执行(可以指向其它命名空间的,比如:com.whx.bus.mapper.WayMapper.selectByPrimaryKey)-->
    <!-- 在column属性中指定需传递给子查询的参数 -->
    <!-- 在property属性中指定Java对象中的变量名 -->
    <!-- 在ofType属性中指定泛型集合对应的对象的限定名(如果是单个对象的话就是javaType) -->
    <collection property="stations" ofType="com.whx.bus.entity.Station" column="id" javaType="java.util.ArrayList" select="selectStationsByWay">
    </collection>
  </resultMap>
  <!-- 站点结果集 -->
  <resultMap id="StationResultMap" type="com.whx.bus.entity.Station" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
  </resultMap>
  <!-- 通过主键获取公交信息 -->
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from bus
    where id = #{id,jdbcType=INTEGER}
  </select>

  <!-- 通过路线获取站点信息 -->
  <select id="selectStationsByWay" parameterType="java.lang.Integer" resultMap="StationResultMap">
    select station.* from station inner join way_station on station.id = way_station.stationId where way_station.wayId = #{value}
  </select>
  <!-- 通过司机id查询司机信息 -->
  <select id="selectDriverById" parameterType="java.lang.Integer" resultMap="DriverResultMap">
    select driver.* from driver where id = #{value}
  </select>
  <!-- 通过路线id查询路线信息 -->
  <select id="selectWayById" parameterType="java.lang.Integer" resultMap="WayResultMap">
    select way.* from way where id = #{value}
  </select>
</mapper>

配置了resultMap的嵌套查询之后,调用自己的查询只要调用相应的resultMap之后就可以了,执行查询之后就会自己会调用子查询(注意:子查询其实也是对应一个查询语句,也要有相应的结果集)。
附上一个查询结果的debug
在这里插入图片描述
从图中也是可以看出Bus中的Way对象是有数据的,并且Way中的泛型集合stations也是有数据的,这是因为子查询中的结果集也配置了嵌套查询,所以相对于嵌套了两次~
如果使用多个嵌套需要额外注意,在多对多的情况下,切勿嵌套死循环了,不然就尴尬了~233
需要嵌套对象还是集合就根据自己的需求来了,注意单个对象是association、集合是collection(属性在代码中有说明)
还有一个点需要注意的就是:如果配置了嵌套了,在原查询语句中就不要查嵌套的表了,只查原表中的就行~不然就会出错——切记切记

传递多个参数

如果嵌套查询需传递多个参数

<resultMap id="BaseResultMap" type="com.whx.bus.entity.Bus" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="card" property="card" jdbcType="VARCHAR" />
    <result column="driverId" property="driverid" jdbcType="INTEGER" />
    <result column="wayId" property="wayid" jdbcType="INTEGER" />
    <result column="price" property="price" jdbcType="DOUBLE" />
    <result column="topen" property="topen" jdbcType="TIMESTAMP" />
    <result column="tclose" property="tclose" jdbcType="TIMESTAMP" />
    <!-- 如果这里需要传递一个card和一个driverId到子查询中 -->
    <!-- cardParam表示自查询中用到的键(键可自己定义)、card表示当前结果集的card列的值(列根据上面的结果集来) -->
    <!-- driverIdParam表示自查询中用到的键(键可自己定义)、driverId表示当前结果集的driverId列的值(列根据上面的结果集来) -->
    <association property="driver" column="{cardParam=card,driverIdParam=driverId}" javaType="com.whx.bus.entity.Driver" select="selectDriverById">
    </association>
</resultMap>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179233.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sort函数,我用总是莫名其妙的错

    sort函数,我用总是莫名其妙的错

    2021年9月27日
    71
  • linux下多线程通信(一)「建议收藏」

    linux下多线程通信(一)「建议收藏」在linux下进行多线程编程,肯定会涉及到线程通信问题,本文主要分析pipe,即管道在多线之间通信实现。#include&amp;amp;amp;amp;lt;unistd.h&amp;amp;amp;amp;gt;intpipe(intfiledes[2]);返回值:成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道两个线程之间通信简单实现,单向pipe_1.c在这里插入代码片…

    2022年6月19日
    30
  • MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法「建议收藏」

    MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法「建议收藏」MySQL的时间差函数TIMESTAMPDIFF、DATEDIFF的用法时间差函数TIMESTAMPDIFF、DATEDIFF的用法我们在写sql语句,尤其是存储过程中,会频繁用到对于日期、时间的比较和判断,那么对于这两个时间差比较函数用法做一个举例介绍。datediff函数,返回值是相差的天数,不能定位到小时、分钟和秒。–相差2天selectdatediff(‘2018-03-2209:…

    2022年6月13日
    48
  • JavaScript 匿名函数几种执行方式[通俗易懂]

    JavaScript 匿名函数几种执行方式[通俗易懂]参考1、javascript自执行匿名函数  http://blog.csdn.net/jbgtwang/article/details/6608265其中说到了self-executinganonymousfunctions,有几种方式,最常见也比较容易理解的是:(function(){//dosomethinghere;})();格式:     (fun

    2022年10月3日
    3
  • 如何激活成功教程Mac软件的付费限制(一)

    如何激活成功教程Mac软件的付费限制(一)一、前言在使用Mac的过程中,经常会碰到一些软件,属于付费使用产品。那么处于好奇或者自学的目的,能不能绕过这个限制呢。今天简单的分享下我激活成功教程的几款软件当中的一款,具体是什么软件就不说了,主要是提供下激活成功教程的思路。由于不能供发图,所以这里简单介绍下这款软件。这款软件是AppStore上的一款磁盘清理软件,扫描是免费的。扫描到数据之后,点击清理按钮时候会检查是否注册。如果注册了,直接进入清理程序,否…

    2022年6月15日
    121
  • 大数据可视化的方法、挑战及进展[通俗易懂]

    大数据可视化的方法、挑战及进展[通俗易懂]大数据可视化的方法、挑战及进展摘要:在简化数据量和降低大数据应用的复杂性中,大数据分析发挥着关键的作用。可视化是其中一个重要的途径,它能够帮助大数据获得完整的数据视图并挖掘数据的价值。大数据分析和可视化应该无缝连接,这样才能在大数据应用中发挥最大的功效。这篇文章将介绍一些常规的数据可视化方法以及在大数据应用领域突破常规的可视化手段,也会讨论大数据可视化带来的挑战,同时介绍大数据可视化领域新的方

    2022年5月4日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号