mybatis中嵌套查詢的使用解讀
mybatis嵌套查詢的使用
在使用mybatis時(shí),當(dāng)我們遇到表與表之之間存在關(guān)聯(lián)的時(shí)候,就可以使用嵌套查詢
比如說
當(dāng)一個(gè)對(duì)象包含了另一個(gè)對(duì)象
/** * 公交實(shí)體類中包含了司機(jī)信息和路線信息 */ 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;//司機(jī) private Way way;//路線 //省略封裝方法 }
當(dāng)一個(gè)對(duì)象中包含另一個(gè)對(duì)象的泛型集合
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; //省略封裝方法 }
當(dāng)一個(gè)對(duì)象中包含了另外一個(gè)對(duì)象時(shí),在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屬性中指向需要調(diào)用哪個(gè)sql執(zhí)行(可以指向其它命名空間的,比如:com.whx.bus.mapper.WayMapper.selectByPrimaryKey)--> <!-- 在column屬性中指定需傳遞給子查詢的參數(shù) --> <!-- 在property屬性中指定Java對(duì)象中的變量名 --> <!-- 在javaType屬性中指定當(dāng)前對(duì)象的限定名(如果是集合的話就是ofType) --> <association property="driver" column="driverId" javaType="com.whx.bus.entity.Driver" select="selectDriverById"> </association> <!-- 在select屬性中指向需要調(diào)用哪個(gè)sql執(zhí)行(可以指向其它命名空間的,比如:com.whx.bus.mapper.WayMapper.selectByPrimaryKey)--> <!-- 在column屬性中指定需傳遞給子查詢的參數(shù) --> <!-- 在property屬性中指定Java對(duì)象中的變量名 --> <!-- 在javaType屬性中指定當(dāng)前對(duì)象的限定名(如果是集合的話就是ofType) --> <association property="way" column="wayId" javaType="com.whx.bus.entity.Way" select="selectWayById"> </association> </resultMap> <!-- 司機(jī)結(jié)果集 --> <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> <!-- 路線結(jié)果集 --> <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屬性中指向需要調(diào)用哪個(gè)sql執(zhí)行(可以指向其它命名空間的,比如:com.whx.bus.mapper.WayMapper.selectByPrimaryKey)--> <!-- 在column屬性中指定需傳遞給子查詢的參數(shù) --> <!-- 在property屬性中指定Java對(duì)象中的變量名 --> <!-- 在ofType屬性中指定泛型集合對(duì)應(yīng)的對(duì)象的限定名(如果是單個(gè)對(duì)象的話就是javaType) --> <collection property="stations" ofType="com.whx.bus.entity.Station" column="id" javaType="java.util.ArrayList" select="selectStationsByWay"> </collection> </resultMap> <!-- 站點(diǎn)結(jié)果集 --> <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> <!-- 通過路線獲取站點(diǎn)信息 --> <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> <!-- 通過司機(jī)id查詢司機(jī)信息 --> <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的嵌套查詢之后,調(diào)用自己的查詢只要調(diào)用相應(yīng)的resultMap之后就可以了,執(zhí)行查詢之后就會(huì)自己會(huì)調(diào)用子查詢(注意:子查詢其實(shí)也是對(duì)應(yīng)一個(gè)查詢語句,也要有相應(yīng)的結(jié)果集)。
附上一個(gè)查詢結(jié)果的debug
從圖中也是可以看出Bus中的Way對(duì)象是有數(shù)據(jù)的,并且Way中的泛型集合stations也是有數(shù)據(jù)的,這是因?yàn)樽硬樵冎械慕Y(jié)果集也配置了嵌套查詢,所以相對(duì)于嵌套了兩次~
如果使用多個(gè)嵌套需要額外注意,在多對(duì)多的情況下,切勿嵌套死循環(huán)了,不然就尷尬了~233
需要嵌套對(duì)象還是集合就根據(jù)自己的需求來了,注意單個(gè)對(duì)象是association、集合是collection(屬性在代碼中有說明)
還有一個(gè)點(diǎn)需要注意的就是:如果配置了嵌套了,在原查詢語句中就不要查嵌套的表了,只查原表中的就行~不然就會(huì)出錯(cuò)——切記切記
傳遞多個(gè)參數(shù)
如果嵌套查詢需傳遞多個(gè)參數(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" /> <!-- 如果這里需要傳遞一個(gè)card和一個(gè)driverId到子查詢中 --> <!-- cardParam表示自查詢中用到的鍵(鍵可自己定義)、card表示當(dāng)前結(jié)果集的card列的值(列根據(jù)上面的結(jié)果集來) --> <!-- driverIdParam表示自查詢中用到的鍵(鍵可自己定義)、driverId表示當(dāng)前結(jié)果集的driverId列的值(列根據(jù)上面的結(jié)果集來) --> <association property="driver" column="{cardParam=card,driverIdParam=driverId}" javaType="com.whx.bus.entity.Driver" select="selectDriverById"> </association> </resultMap>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot?實(shí)現(xiàn)不同context-path下的會(huì)話共享
這篇文章主要介紹了springboot?實(shí)現(xiàn)不同context-path下的會(huì)話共享,基于很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01SpringBoot整合MybatisPlus的基本應(yīng)用詳解
MyBatis-Plus (簡稱 MP)是一個(gè) MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為 簡化開發(fā)、提高效率而生,本文將給大家介紹一下SpringBoot整合MybatisPlus的基本應(yīng)用,需要的朋友可以參考下2024-05-05SpringBoot添加自定義攔截器的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot添加自定義攔截器的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09Spring?main方法中如何調(diào)用Dao層和Service層的方法
這篇文章主要介紹了Spring?main方法中調(diào)用Dao層和Service層的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Spring實(shí)戰(zhàn)之方法級(jí)別緩存用法示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之方法級(jí)別緩存用法,結(jié)合實(shí)例形式分析了spring方法級(jí)別緩存配置、屬性文件、領(lǐng)域模型及相關(guān)使用技巧,需要的朋友可以參考下2020-01-01利用spring的攔截器自定義緩存的實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了利用spring的攔截器自定義緩存的實(shí)現(xiàn)實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02java實(shí)現(xiàn)拉鉤網(wǎng)上的FizzBuzzWhizz問題示例
這篇文章主要介紹了java實(shí)現(xiàn)拉鉤網(wǎng)上的FizzBuzzWhizz問題示例,需要的朋友可以參考下2014-05-05