欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis中嵌套查詢的使用解讀

 更新時間:2023年03月15日 10:38:04   作者:jamesluozhiwei  
這篇文章主要介紹了mybatis中嵌套查詢的使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

mybatis嵌套查詢的使用

在使用mybatis時,當我們遇到表與表之之間存在關聯(lián)的時候,就可以使用嵌套查詢

比如說

當一個對象包含了另一個對象

/**
 * 公交實體類中包含了司機信息和路線信息
 */
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執(zhí)行(可以指向其它命名空間的,比如:com.whx.bus.mapper.WayMapper.selectByPrimaryKey)-->
    <!-- 在column屬性中指定需傳遞給子查詢的參數(shù) -->
    <!-- 在property屬性中指定Java對象中的變量名 -->
    <!-- 在javaType屬性中指定當前對象的限定名(如果是集合的話就是ofType) -->
    <association property="driver" column="driverId" javaType="com.whx.bus.entity.Driver" select="selectDriverById">
    </association>
    <!-- 在select屬性中指向需要調用哪個sql執(zhí)行(可以指向其它命名空間的,比如:com.whx.bus.mapper.WayMapper.selectByPrimaryKey)-->
    <!-- 在column屬性中指定需傳遞給子查詢的參數(shù) -->
    <!-- 在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執(zhí)行(可以指向其它命名空間的,比如:com.whx.bus.mapper.WayMapper.selectByPrimaryKey)-->
    <!-- 在column屬性中指定需傳遞給子查詢的參數(shù) -->
    <!-- 在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之后就可以了,執(zhí)行查詢之后就會自己會調用子查詢(注意:子查詢其實也是對應一個查詢語句,也要有相應的結果集)。

附上一個查詢結果的debug

從圖中也是可以看出Bus中的Way對象是有數(shù)據(jù)的,并且Way中的泛型集合stations也是有數(shù)據(jù)的,這是因為子查詢中的結果集也配置了嵌套查詢,所以相對于嵌套了兩次~

如果使用多個嵌套需要額外注意,在多對多的情況下,切勿嵌套死循環(huán)了,不然就尷尬了~233

需要嵌套對象還是集合就根據(jù)自己的需求來了,注意單個對象是association、集合是collection(屬性在代碼中有說明)

還有一個點需要注意的就是:如果配置了嵌套了,在原查詢語句中就不要查嵌套的表了,只查原表中的就行~不然就會出錯——切記切記

傳遞多個參數(shù)

如果嵌套查詢需傳遞多個參數(shù)

<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列的值(列根據(jù)上面的結果集來) -->
    <!-- driverIdParam表示自查詢中用到的鍵(鍵可自己定義)、driverId表示當前結果集的driverId列的值(列根據(jù)上面的結果集來) -->
    <association property="driver" column="{cardParam=card,driverIdParam=driverId}" javaType="com.whx.bus.entity.Driver" select="selectDriverById">
    </association>
</resultMap>

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • springboot?實現(xiàn)不同context-path下的會話共享

    springboot?實現(xiàn)不同context-path下的會話共享

    這篇文章主要介紹了springboot?實現(xiàn)不同context-path下的會話共享,基于很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot整合MybatisPlus的基本應用詳解

    SpringBoot整合MybatisPlus的基本應用詳解

    MyBatis-Plus (簡稱 MP)是一個 MyBatis的增強工具,在 MyBatis 的基礎上只做增強不做改變,為 簡化開發(fā)、提高效率而生,本文將給大家介紹一下SpringBoot整合MybatisPlus的基本應用,需要的朋友可以參考下
    2024-05-05
  • SpringBoot添加自定義攔截器的實現(xiàn)代碼

    SpringBoot添加自定義攔截器的實現(xiàn)代碼

    這篇文章主要介紹了SpringBoot添加自定義攔截器的實現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • Spring?main方法中如何調用Dao層和Service層的方法

    Spring?main方法中如何調用Dao層和Service層的方法

    這篇文章主要介紹了Spring?main方法中調用Dao層和Service層的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring實戰(zhàn)之方法級別緩存用法示例

    Spring實戰(zhàn)之方法級別緩存用法示例

    這篇文章主要介紹了Spring實戰(zhàn)之方法級別緩存用法,結合實例形式分析了spring方法級別緩存配置、屬性文件、領域模型及相關使用技巧,需要的朋友可以參考下
    2020-01-01
  • Java?異常機制Exception和自定義異常

    Java?異常機制Exception和自定義異常

    這篇文章主要介紹了Java?異常機制Exception+自定義異常,異常分三種檢查性異常、運行時異常、錯誤ERROR,下文對其更多詳細介紹,需要的小伙伴可以參考一下
    2022-05-05
  • Java之常用類小結案例講解

    Java之常用類小結案例講解

    這篇文章主要介紹了Java之常用類小結案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 利用spring的攔截器自定義緩存的實現(xiàn)實例代碼

    利用spring的攔截器自定義緩存的實現(xiàn)實例代碼

    這篇文章主要介紹了利用spring的攔截器自定義緩存的實現(xiàn)實例代碼,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • java實現(xiàn)拉鉤網上的FizzBuzzWhizz問題示例

    java實現(xiàn)拉鉤網上的FizzBuzzWhizz問題示例

    這篇文章主要介紹了java實現(xiàn)拉鉤網上的FizzBuzzWhizz問題示例,需要的朋友可以參考下
    2014-05-05
  • java實現(xiàn)順時針打印矩陣

    java實現(xiàn)順時針打印矩陣

    這篇文章主要為大家詳細介紹了java實現(xiàn)順時針打印矩陣的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評論