最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis中一對多的xml配置方式(嵌套查詢/嵌套結(jié)果)

 更新時間:2022年03月11日 09:39:42   作者:CsbLanca  
這篇文章主要介紹了MyBatis中一對多的xml配置方式(嵌套查詢/嵌套結(jié)果),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

MyBatis一對多的xml配置

用的是window上面的畫圖板,沒法以文字的方式展示出來,見諒

嵌套查詢

嵌套結(jié)果

一對多關(guān)聯(lián)查詢xml配置寫法  

情景概述

1、有一張客戶表 Client ,存儲客戶信息, 姓名 name ,年齡 age等。

2、有一張客戶附件表 client_file ,存儲客戶附件信息,附件名 name ,路徑 path 等,其中通過外鍵 client_id 關(guān)聯(lián)到 client表,獲取附件對應(yīng)的客戶信息。

3、需求如下:

  • 查詢某個客戶時,獲取客戶名下的所有附件信息。 (一對多查詢)
  • 查詢某個附件時,獲取附件所屬的客戶信息。 (一對一 查詢)

創(chuàng)建表

1、創(chuàng)建 client 表,并插入數(shù)據(jù)

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for client
-- ----------------------------
DROP TABLE IF EXISTS `client`;
CREATE TABLE `client` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '編號',
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `age` int(255) DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of client
-- ----------------------------
INSERT INTO `client` VALUES ('1', '小明', '18');
INSERT INTO `client` VALUES ('2', '小紅', '22');
INSERT INTO `client` VALUES ('3', '小剛', '27');

2、創(chuàng)建 client_file 表,并插入數(shù)據(jù)

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for client_file
-- ----------------------------
DROP TABLE IF EXISTS `client_file`;
CREATE TABLE `client_file` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '編號',
  `name` varchar(255) DEFAULT NULL COMMENT '附件名',
  `path` varchar(255) DEFAULT NULL COMMENT '附件路徑',
  `client_id` int(11) DEFAULT NULL COMMENT '客戶id',
  PRIMARY KEY (`id`),
  KEY `client_id` (`client_id`),
  CONSTRAINT `client_id` FOREIGN KEY (`client_id`) REFERENCES `client` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of client_file
-- ----------------------------
INSERT INTO `client_file` VALUES ('1', '小明電影', '/usr/local/子彈飛.mp4', '1');
INSERT INTO `client_file` VALUES ('2', '小明簡歷', '/usr/doc/小明.docx', '1');
INSERT INTO `client_file` VALUES ('3', '小明代碼', '/usr/code/main.java', '1');
INSERT INTO `client_file` VALUES ('4', '小紅靚照', 'E:\\image\\xiaohong.jpg', '2');

3、關(guān)系如下:

對應(yīng) java Pojo

1、client表對應(yīng) Client.java

public class Client2 implements Serializable {
	private static final long serialVersionUID = 1L;
	private String id;
	private String name;		// 姓名
	private String age;		// 年齡
	private List<ClientFile> clientFileList ; // 客戶名下的附件 list
	// ======= ignore getter,setter  ========= // 
}

2、client_file表對應(yīng) ClientFile.java

public class ClientFile implements Serializable {
	private static final long serialVersionUID = 1L;
	private String id; 
	private String path;		// 附件路徑
	private String clientId;		// 客戶id
	private Client clientInfo ; // 客戶信息
// ======= ignore getter,setter  ========= // 
}

查詢 客戶表client 獲取客戶名下的附件信息

1、方法一: 使用一個結(jié)果集實現(xiàn)獲取client表客戶關(guān)聯(lián)的附件信息(錯誤方法)

1.1、 resultMap 定義:

<resultMap type="Client" id="clientMapError">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="age" column="age"/>
	<collection property="clientFileList" ofType="ClientFile">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="path" column="path"/>
		<result property="clientId" column="client_id"/>
	</collection>
</resultMap>

1.2、SQL查詢代碼:

<select id="getMapError" resultMap="clientMapError" parameterType="Client">
	SELECT 
		a.id , a.name , a.age ,
		cf.id, cf.name , cf.path , cf.client_id 
	FROM client a
	LEFT JOIN client_file cf on cf.client_id = a.id 
	WHERE a.id = #{id}
</select>

1.3、測試:獲取客戶 id=1的客戶名下附件,查詢結(jié)果如下JSON:

1.4、原因分析:通過查看client_file表,client_id=1,對應(yīng)有3個附件,而本次查詢中只查到了一個附件,且client_file表中id=1的name值為"小明電影"??梢钥吹?client表和client_file表中有共同字段id,name 在映射的時候?qū)lient表中數(shù)據(jù)映射到 client_file表中去了,解決這一問題,需要將 client_file表中重名字段做別名處理。

2、方法一: 使用一個結(jié)果集實現(xiàn)獲取client表客戶關(guān)聯(lián)的附件信息。(重名字段做別名處理)

2.1、 resultMap 定義:

<resultMap type="Client" id="clientMap">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="age" column="age"/>
	<collection property="clientFileList" ofType="ClientFile">
		<id property="id" column="fileId"/>
		<result property="name" column="fileName"/>
		<result property="path" column="path"/>
		<result property="clientId" column="client_id"/>
	</collection>
</resultMap>

2.2、SQL 查詢代碼:

<select id="getMap" resultMap="clientMap" parameterType="Client">
	SELECT 
		a.id , a.name , a.age ,
		cf.id AS "fileId", cf.name AS "fileName" , cf.path , cf.client_id 
	FROM client a
	LEFT JOIN client_file cf on cf.client_id = a.id 
	WHERE a.id = #{id}
</select>

2.3、測試:獲取客戶 id=1 的客戶名下附件,查詢結(jié)果如下JSON:

3、方法二:使用多個結(jié)果集實現(xiàn)獲取client表客戶關(guān)聯(lián)的附件信息。(重名字段不做別名處理)

3.1、resultMap 定義:

<resultMap type="Client" id="clientMap2">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="age" column="age"/>
	<!-- column: 對應(yīng)的外鍵。 client表的id是client_file表的 外鍵 -->
	<collection property="clientFileList" ofType="ClientFile" column="id" 
                select="getClientFileList"></collection>
</resultMap>

3.2、SQL查詢代碼:

<select id="getMap2" resultMap="clientMap2" parameterType="Client">
    SELECT 
	a.id , a.name , a.age 
	FROM client a 
	WHERE id = #{id}
</select>
 
<select id="getClientFileList" resultType="ClientFile" parameterType="int">
	SELECT 
	b.id , b.name , b.path , b.client_id
	FROM client_file b
	WHERE client_id = #{id}
</select>

3.3、獲取客戶 id=2 的客戶名下附件,查詢結(jié)果如下JSON:

查詢 客戶附件表 client_file 獲取附件所屬的客戶信息

1、方法一:使用一個結(jié)果集實現(xiàn)獲取client_file表所屬的客戶信息(錯誤方法)

1.1、resultMap 定義:

<resultMap type="ClientFile" id="clientFileMapError">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="path" column="path"/>
	<result property="clientId" column="client_id"/>
	<association property="clientInfo" javaType="Client">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="age" column="age"/>
	</association>
</resultMap>

1.2、SQL查詢代碼:

<select id="getMapError" resultMap="clientFileMapError" parameterType="ClientFile">
	SELECT 
		cf.id , cf.name , cf.path ,cf.client_id
		, a.id , a.name , age
	FROM client_file cf 
	LEFT JOIN client a on a.id = cf.client_id
	WHERE cf.id = #{id}
</select>

1.3、測試:獲取附件表 id=3 的附件所屬客戶信息,查詢結(jié)果如下JSON:

1.4、原因分析:通過查看client_file表id=3,對應(yīng)client_id為1,而查詢到的clientInfo對象中id=3,name="小明代碼",這里和client表中的數(shù)據(jù)不對,原因同上----字段對應(yīng)屬性值映射錯誤。解決這個問題,需要將重名字段進行別名處理。

2、方法一:使用一個結(jié)果集實現(xiàn)獲取client_file表所屬的客戶信息。(重名字段別名處理)

2.1、resultMap 定義:

<resultMap type="ClientFile" id="clientFileMap">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="path" column="path"/>
	<result property="clientId" column="client_id"/>
	<association property="clientInfo" javaType="Client">
		<id property="id" column="c_id"/>
		<result property="name" column="clientName"/>
		<result property="age" column="age"/>
	</association>
</resultMap>

2.2、SQL查詢代碼:

<select id="getMap" resultMap="clientFileMap" parameterType="ClientFile">
	SELECT 
		cf.id , cf.name , cf.path ,cf.client_id
		, a.id AS "c_id"  , a.name  AS "clientName", age
	FROM client_file cf 
	LEFT JOIN client a on a.id = cf.client_id
	WHERE cf.id= #{id}
</select>

2.3、測試:獲取附件表 id=2 的附件所屬客戶信息,查詢結(jié)果如下JSON:

3、方法二:使用多個結(jié)果集實現(xiàn)獲取client_file表所屬的客戶信息(重名字段不處理)

3.1、resultMap 定義:

<resultMap type="ClientFile" id="clientFileMap2">
	<id property="id" column="id"/>
	<result property="name" column="name"/>
	<result property="path" column="path"/>
	<result property="clientId" column="client_id"/>
	<association property="clientInfo" column="client_id" select="getClientInfo"></association>
</resultMap>

3.2、SQL查詢代碼:

<select id="getMap2" resultMap="clientFileMap2" parameterType="ClientFile">
	SELECT 
		cf.id , cf.name , cf.path ,cf.client_id
	FROM client_file cf 
	WHERE cf.id= #{id}
</select>
<select id="getClientInfo" resultType="Client" parameterType="int">
	SELECT
		id , name ,age 
	FROM client 
	WHERE id = #{id}
</select>

3.3、獲取附件表 id=4 的附件所屬客戶信息,查詢結(jié)果如下JSON:

小結(jié)一下

1、MyBatis中一對多關(guān)聯(lián)查詢使用 <collection> 標簽來實現(xiàn)關(guān)聯(lián),主要屬性作用如下:

  • property:java對象名稱
  • ofType:java對象的類型
  • column:當(dāng)前表對應(yīng)的外鍵字段名稱
  • select:另一個數(shù)據(jù)集的名稱

2、MyBatis中一對一關(guān)聯(lián)查詢使用 <association> 標簽來實現(xiàn)關(guān)聯(lián),主要屬性作用如下:

  • property:java對象名稱
  • javaType:java對象類型
  • colmun:當(dāng)前表對應(yīng)的外鍵字段名稱
  • seelct:另一個數(shù)據(jù)集的名稱

3、使用一個數(shù)據(jù)集時,注意關(guān)聯(lián)表之間的字段是否有重名情況,若有重名,需要別名處理。

4、使用多個數(shù)據(jù)集時,無需關(guān)注字段重名情況。

5、一個 resultMap標簽可以配置多個<collection>標簽和<association>標簽。

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

相關(guān)文章

  • 使用MyBatisPlus自動生成代碼后tomcat運行報錯的問題及解決方法

    使用MyBatisPlus自動生成代碼后tomcat運行報錯的問題及解決方法

    這篇文章主要介紹了使用MyBatisPlus自動生成代碼后tomcat運行報錯的問題及解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • MyBatis配置文件的寫法和簡單使用

    MyBatis配置文件的寫法和簡單使用

    MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架。這篇文章主要介紹了MyBatis配置文件的寫法和簡單使用,需要的朋友參考下
    2017-01-01
  • JSR303校驗注解和自定義校驗注解的使用

    JSR303校驗注解和自定義校驗注解的使用

    這篇文章主要介紹了JSR303校驗注解和自定義校驗注解的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 快速解決?IDEA?報錯:?“java?找不到符號“(“cannot?find?symbol“)

    快速解決?IDEA?報錯:?“java?找不到符號“(“cannot?find?symbol“)

    文章詳細講解了在IntelliJIDEA中解決“找不到符號”錯誤的方法,包括檢查導(dǎo)入語句、拼寫錯誤、類路徑設(shè)置、文件編譯狀態(tài)、JDK配置以及IDE配置問題,通過具體示例代碼,展示了如何從錯誤代碼到解決步驟,感興趣的朋友一起看看吧
    2025-03-03
  • 聊聊在獲取方法參數(shù)名方面,Spring真的就比Mybatis強?

    聊聊在獲取方法參數(shù)名方面,Spring真的就比Mybatis強?

    在獲取方法參數(shù)名方面,Spring真的就比Mybatis強嗎?今天就帶大家聊聊這個話題,如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java雜談之如何優(yōu)化寫出漂亮高效的代碼

    Java雜談之如何優(yōu)化寫出漂亮高效的代碼

    不一致的代碼會造成認知上的負擔(dān),在一個系統(tǒng)中,做類似的事情,卻有不同的做法,或者起到類似作用的事物,卻有不同的名字,讓人困惑
    2021-09-09
  • BeanUtils.copyProperties()拷貝id屬性失敗的原因及解決

    BeanUtils.copyProperties()拷貝id屬性失敗的原因及解決

    這篇文章主要介紹了BeanUtils.copyProperties()拷貝id屬性失敗的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中實現(xiàn)高清圖片壓縮的兩種方案(最新推薦)

    Java中實現(xiàn)高清圖片壓縮的兩種方案(最新推薦)

    文章首先介紹了Java中進行高清圖片壓縮的基本方法,包括使用Java標準庫ImageIO和第三方庫ApacheCommonsCompress,通過示例代碼展示了如何調(diào)整圖像質(zhì)量和使用第三方工具來壓縮圖片文件,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • 實例解析Java關(guān)于static的作用

    實例解析Java關(guān)于static的作用

    只要是有學(xué)過Java的都一定知道static,也一定能多多少少說出一些作用和注意事項。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • springboot自定義異常視圖過程解析

    springboot自定義異常視圖過程解析

    這篇文章主要介紹了springboot自定義異常視圖過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12

最新評論

连城县| 芮城县| 武安市| 丽江市| 靖江市| 大竹县| 巧家县| 扶风县| 蚌埠市| 潮安县| 丽江市| 马尔康县| 绍兴县| 娄底市| 蕲春县| 陕西省| 田阳县| 简阳市| 筠连县| 龙胜| 长海县| 砀山县| 寿阳县| 永城市| 长乐市| 瑞安市| 安新县| 长宁区| 灵丘县| 萝北县| 石家庄市| 清苑县| 资阳市| 南靖县| 惠水县| 金乡县| 云霄县| 哈密市| 泾川县| 凯里市| 安新县|