Mybatis ResultMap多表對映DTO

2022-03-30 00:42:05 字數 1673 閱讀 5369

解決問題:n+1問題,之前我的習慣是拿到單錶裡面的資料,然後遍歷,再拿到乙個與其他表對應的邏輯上的外來鍵,然後for迴圈去查詢其他表的資料(原因是資料量小,沒有在意,還有主要是不想建外鍵,你知道的,外來鍵是很麻煩的,雖然有利於查詢,但是增刪改確實很讓人頭疼),這樣做也能達到效果,但是效率低,訪問資料庫的次數也太多了,假設我查詢出了1000條資料,我要用他裡面的邏輯外來鍵去查詢其他表1000次,就意味著訪問資料1000次,這樣做還會遇到一些問題,若當前的邏輯外來鍵查詢在對應的表裡面沒有資料,就會丟擲異常,從程式出錯

例子,我要返回前端乙個封裝好的實體模型,裡面包含了多個不在同乙個資料表的字段,這就涉及到了多表查詢,我把需要返回前端的字段封裝為乙個dto

步驟:

1:構建dto

package com.steak.system.pojo.dto;

public

class

private

private

private

private

string username; //申請人,屬於使用者表(sys_user)

private

string collegename; //二級學院名稱,屬於二級學院表(sys_college)

private

string recruitname; //招聘書標題 , 屬於招聘表(sys_recruit)

private

}從上面可以看出上面的字段涉及了四個表

<?xml version="1.0" encoding="utf-8"?>

fromsys_recruit r,sys_user u,sys_college c

and release_people_id = #

4:返回結果

額外:實體之間的轉換(少寫**)

如:我封裝的dto裡面有乙個欄位int型別的字段status,一般在資料庫裡面我們用數字來表示,但是返回前台我們應該用乙個別人能夠理解的字段來表示(如待審核,已審核),由此我們需要定義乙個vo(返回前端的模型,裡面的字段要和dto裡面所要轉換的的字段相同,注意,是需要轉換的,我也可以在vo裡面定義其他的,dto轉換的時候只轉換vo裡面和自己對應的),然後通過set方式將值轉換到vo裡面,資料字段少其實可以手動set,如果有50個字段,乙個字段乙個欄位的去set(實際上我只需要轉換乙個status欄位就ok,當然也可以交給前端來處理,但是有時候前端並不知道代表什麼,所以我們盡量給前端解析好,別人就不用去猜測了),費力費時,**還不優雅,所以推薦使用一些實體的轉換工具,我使用的是apache的beanutils,裡面有轉換的方法,如我將dto轉換為vo,如下便可

beanutils.copyproperties(vo,dto);

這樣的話我就將所有資料轉到vo裡面了,我們在vo裡面的status欄位設定為string,然後取dto裡面的status欄位出來進行語義化成乙個可理解的字段,為什麼不取vo裡面的,要取dto呢,前面已經說了只能轉換和自己對應的,因為dto裡面的status為int型別,而vo裡面的status為string,所以轉過來vo裡面的status為null,所以需要取dto裡面的status,然後賦值給vo裡面的status,如:1=待審核 2=已審核

MYBATIS RESULTMAP的使用總結

resultmap是mybatis最強大的元素,它可以將查詢到的複雜資料 比如查詢到幾個表中資料 對映到乙個結果集當中。resultmap包含的元素 1 2 3 4 5 6 7 8 9 10 11 12 13 14 如果collection標籤是使用巢狀查詢,格式如下 以下以例項介紹resultma...

hibernate中多表對映關係配置

1.one to many一對多關係的對映配置 在一的一方實體對映檔案中配置 set name linkmen inverse true key column lkm cust id key one to many class linkman set 一對多 多對一關係中,放置sql語句冗餘.一般選...

多表查詢 多表查詢 多表查詢

查詢語法 select 列表名稱 from 表明列表 where 笛卡爾積 有兩個集合a,b,取這兩個集合的所有組成情況 要完成多表查詢,需要消除無用的資料 多表查詢分類 1 內連線查詢 1 隱式內連線 使用where消除無用的資料 例子 select t1.name,t1.gender,t2.na...