2017.8.18

1、問(wèn)題1昨天在做多個(gè)數(shù)據(jù)庫(kù)表之間的依賴查詢更新時(shí)遇到一個(gè)問(wèn)題。

場(chǎng)景:
A表和B表之間有依賴,當(dāng)我需要通過(guò)它們之間的關(guān)系來(lái)修改B表的某些值時(shí),我使用了以下的代碼:

UPDATE ALEFT JOIN BON A.id = B.idSET B.age = A.age
WHERE ......

導(dǎo)致的問(wèn)題是:B中需要修改的字段有的被改變了,有的沒(méi)有被改變。

1.1、解決思路

查詢相關(guān)的知識(shí)后,才發(fā)現(xiàn)原來(lái)是自己理解有誤,LEFT JOIN的意思是將左邊表的所有表項(xiàng)都能拿出來(lái),然后進(jìn)行修改。如下圖所示:

圖片.png

這樣就會(huì)導(dǎo)致在修改B表時(shí),因?yàn)橹荒贸隽艘徊糠?,所以有的修改了,有的沒(méi)有修改。正確的做法應(yīng)該是:
方案1:

UPDATE B LEFT JOIN AON A.id = B.idSET B.age = A.age

方案2:

UPDATE B RIGHT JOIN A
    ON A.id = B.id
SET B.age = A.age

1.2、反思

之所以寫成這樣,是因?yàn)樵谖液蚿air結(jié)對(duì)的過(guò)程中,我一直看他都是這么寫,自己私下卻沒(méi)有搞清楚其中的原理。總覺(jué)得挺簡(jiǎn)單的,用的時(shí)候我去查下就好了,這是一種錯(cuò)誤的做法,現(xiàn)在將JOIN有關(guān)的總結(jié)如下:
求差集:

圖片.png
SELECT * FROM A LEFT JOIN B ON A.name = B.nameWHERE B.id IS NULLunionSELECT * FROM A right JOIN B ON A.name = B.nameWHERE A.id IS NULL;

求所有的集合:

圖片.png
select * from A left join B on B.name = A.name union select * from A right join B on B.name = A.name;

2、問(wèn)題2

關(guān)于Mybaits嵌套查詢的問(wèn)題。
現(xiàn)在有如下需求:有兩張數(shù)據(jù)庫(kù)表,表A和表B,我想通過(guò)表A中的id找到與表B中id相同的字段,但是在表B中與表A相同的id有多個(gè),但是要求我必須要將表B中查詢到的數(shù)據(jù)放在一個(gè)集合中。

2.1、思路

最開(kāi)始嘗試的辦法,就是使用sql,將數(shù)據(jù)查詢出來(lái),然后再在java代碼級(jí)別,進(jìn)行數(shù)據(jù)的組裝,發(fā)現(xiàn)處理起來(lái)實(shí)在是麻煩。最后林老師告訴我,我們?cè)谑褂胢ybits,會(huì)方便處理這個(gè),由于之前沒(méi)有這方面的經(jīng)驗(yàn),所以對(duì)Mybits沒(méi)有想到。下來(lái)將mybits處理這種需求的方案記錄下來(lái):1.首先會(huì)使用相關(guān)的類來(lái)調(diào)用對(duì)數(shù)據(jù)庫(kù)的操作:

//根據(jù)id 來(lái)查找一個(gè)表項(xiàng)的所有內(nèi)容
Table  getbyId(Integer id)

2.添加相關(guān)的配置文件:

 <resultMap id="getTableMap" type="com.example.Table">
 <id property="id" column="id"></id> <result property="age" column="age" /> <collection property="choices" ofType="string" javaType="list"> <result column="choice" /> </collection></resultMap><select id="getById" resultMap="getTableMap"> SELECT *FROM ALEFT JOIN B ON A.id=B.idWHERE id =#{id};</select>

解釋:
當(dāng)使用getById時(shí),會(huì)進(jìn)入到select部分,執(zhí)行sql語(yǔ)句,查詢到數(shù)據(jù)庫(kù)中的數(shù)據(jù)后,會(huì)將結(jié)果進(jìn)入到resultMap中,將結(jié)果依據(jù)配置,放入到具體的類對(duì)象中。即resultMap中的內(nèi)容,id,age,choices等都表示具體的字段名,其中property表示類中的字段名,column表示具體的數(shù)據(jù)庫(kù)列名(注意一定要對(duì)應(yīng)切來(lái),否則會(huì)出錯(cuò))。collection標(biāo)簽就表示希望將從數(shù)據(jù)庫(kù)中的到的內(nèi)容放入到一個(gè)集合中,在這里表示將多個(gè)choice放入到類型為string的list結(jié)合中。從而實(shí)現(xiàn)了上面提到的需求。

3、Action

1、通過(guò)這兩天做數(shù)據(jù)庫(kù)遷移方面的工作,發(fā)現(xiàn)了之前對(duì)數(shù)據(jù)庫(kù)操作的基本知識(shí)已經(jīng)不熟悉了,后續(xù)需要對(duì)數(shù)據(jù)庫(kù)的基本操作進(jìn)行學(xué)習(xí)和積累。
2、因?yàn)橹皼](méi)做過(guò)mybits相關(guān)的開(kāi)發(fā),現(xiàn)在項(xiàng)目上使用了,所以需要對(duì)mybits做持續(xù)的學(xué)習(xí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容