天天看點

asp多表查詢并顯示_SpringBoot系列(五):SpringBoot整合Mybatis實作多表關聯查詢1.資料庫表為一對一的平級關聯關系實戰(涉及user、article表)2.資料庫表為一對多/多對多的平級關聯關系實戰

本文我們将繼續分享介紹Spring Boot在整合Mybatis開發企業級應用時其他典型的業務場景,即Mybatis是如何實作多表關聯查詢時将查詢結果集與對象進行映射的,主要的内容包含“一對一的表關聯”和“一對多/多對多的表關聯”查詢。

在上一篇文章中,我們分享介紹了如何基于Spring Boot搭建的标準企業級項目整合第三方的持久層依賴Mybatis,并實作最基本的CRUD功能,此種CRUD估計大夥都明白這是隻針對“單一的資料庫表”操作的。

而本文我們将趁熱打鐵,繼續分享介紹不一樣的内容,即如何基于Mybatis實作“Java對象”與“多表關聯查詢結果集”的映射。

在開始代碼實戰之前,我們簡單的需要建立兩張資料庫表,分别是user使用者表、comment評論表,其對應的資料庫建表語句DDL如下所示:

CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '名字', `code` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '工号', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='使用者資訊表'; 
           
CREATE TABLE `comment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '評論', `user_id` int(11) DEFAULT NULL COMMENT '評論者id', `article_id` int(11) DEFAULT NULL COMMENT '文章id', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='評論';
           

其中,在上一篇文章中建立的資料庫表 “article文章”的user_id即來源于user使用者表的主鍵id,而一篇文章會有很多評論,這些評論資訊将存儲在comment評論表中,進而,我們可以看出,user與article資料表是平級的關系,而article與comment資料庫表則屬于一對多的關聯關系!

廢話不多講,下面就代碼實戰環節:

1.資料庫表為一對一的平級關聯關系實戰(涉及user、article表)

(1)首先我們需要明确實戰的業務場景:“根據文章的主鍵id或者文章的詳情,在文章的詳情中除了需要顯示文章的具體資訊之外,還需要顯示作者的相關資訊”。

基于這樣的業務場景,首先我們需要将Sql寫好,如下所示為Mapper.xml對應的代碼:

SELECT a.id, a.title, a.user_id, b.name AS userName FROM article AS a LEFT JOIN user AS b ON b.id = a.user_id WHERE a.id = #{id} 
           

在這裡,我們采用的是“左關聯”的方式,在擷取文章詳情的同時,擷取該文章所屬的作者的相關資訊!而為了能讓“Java對象”接收存儲查詢出來的屬于使用者層面的資訊,我們需要在Article類中添加使用者相關的“字段資訊”,如下所示(在這裡我們提前将後文即将要介紹的在一對多映射時需要的comments字段建好了!):

@Datapublic class Article {private Integer id; @NotBlank(message = "文章标題不能為空") private String title; @NotNullprivate Integer userId; //子查詢映射 private List comments; //作者名字 private String userName;}
           

緊接着,當然是Controller的代碼啦:

//多表關聯-平級 @RequestMapping(value = "info/{id}") public BaseResponse info(@PathVariable Integer id){ BaseResponse response=new BaseResponse(StatusCode.Success); try { response.setData(articleService.info(id)); }catch (Exception e){ response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage()); } return response; }
           

而Service的代碼邏輯也比較簡單,如下所示:

//詳情 @Override public Article info(Integer id) throws Exception { return articleMapper.selectById(id); }
           

Mapper操作接口對應的方法定義如下所示:

Article selectById(@Param("id") Integer id);
           

最後,當然是将項目運作起來,然後采用浏覽器或者postman進行自測通路,廢話不多講,看圖:

asp多表查詢并顯示_SpringBoot系列(五):SpringBoot整合Mybatis實作多表關聯查詢1.資料庫表為一對一的平級關聯關系實戰(涉及user、article表)2.資料庫表為一對多/多對多的平級關聯關系實戰

檢視該響應結果中userName字段的值,我們即可大膽的認為我們的寫法是沒毛病的!當然啦,如果需要顯示的使用者層面的字段過多,則可以将那些字段資訊封裝成“實體類”,并在Article類中定義該類的對象執行個體即可!如果隻是幾個字段,那就直接定義在Article裡面即可!

2.資料庫表為一對多/多對多的平級關聯關系實戰

(1)對于“一對多的資料庫表關聯實戰”,在這裡我們采用的是以“一篇文章article,将對應着多條評論記錄comment”為案例進行實戰。同樣的道理,首先我們直接看Mapper.xml中動态Sql的寫法:

SELECT a.*, c.name AS userName, b.id AS cId, b.content AS comment, b.user_id AS cUserId FROM article AS a LEFT JOIN `comment` AS b ON b.article_id=a.id LEFT JOIN user AS c ON c.id = a.user_id ORDER BY a.id 
           

在這裡,我們采用的仍然是左關聯的方式進行表與表之間的關聯查詢,a.*代表的是文章的詳細資訊,而b.id,b.content,b.user_id等字段資訊代表的是評論表的資訊,那最終如何展現出這兩個實體對象之間的“一對多關聯”關系呢? 很簡單,我們隻需要做2個步驟:

A.第一是定義查詢的結果集映射,即BaseResultInfoMap,其完整的代碼定義如下所示:

其主要是借助mybatis的collection标簽屬性以及ofType來實作!

B.最後,則是需要在實體類Article中定義一個字段comments,用于接收查詢出來的結果集中有一方是“清單”的資料記錄,如下所示:

@Datapublic class Article { //其他字段省略 //子查詢映射 private List comments;}
           

至此,我們就寫完了相關的代碼了,接下來,當然是進入自測環節,不用多講,直接看圖:

asp多表查詢并顯示_SpringBoot系列(五):SpringBoot整合Mybatis實作多表關聯查詢1.資料庫表為一對一的平級關聯關系實戰(涉及user、article表)2.資料庫表為一對多/多對多的平級關聯關系實戰

至此,基于Spring Boot整合Mybatis實作的關于“多表關聯查詢”業務場景的實戰就已經全部完成了,不知道小夥伴你掌握了沒有呢???

推薦閱讀:

SpringBoot系列(一):如何建構一個标準的Spring Boot項目

繼續閱讀