1. 程式人生 > >Mybatis查詢表資料及其列名,返回List

Mybatis查詢表資料及其列名,返回List

之前遇到一個需求,是要查詢資料庫的表資料的同時查詢出其列名,
當時不知道改怎麼寫SQL ,網上找了一段時間也沒找到想要的答案。

需求大致如下:
需要匯出多個數據庫表中的資料,之前每個表匯出都寫了對應的介面方法,
現在是加了兩張配置表,
第一張A表是要匯出的包的總體配置

  • 要匯出的包的id號,標識表1、表2、表3包
  • 要匯出的包的描述
  • 查詢的檢視的名稱
  • 最終生成的檔名

第二張B表是各個包的匯出列配置

  • 要匯出的包的id號,標識表1、表2、表3包
  • 查詢出資料列的名稱
  • 要匯出的列的解釋
  • 順序
  • 長度
  • 列型別

需要根據要匯出的包的Id 去查詢對應的檢視,得到檢視資料的同時,還得知道這個資料屬於哪一列,這樣才能去和B表中列的描述去進行比對做下一步處理。
網上查到的返回型別為java.util.Map 查詢語句為:select t.id,t.name from tab t;
當時也沒怎麼多想,就以為查詢出的id為key ,name為value
自己給自己挖了一個坑。

所以當時就一心想著怎麼改SQL語句來匯出資料的同時匯出列名。
得到select col1,列名1 from tab union select col2,列名2 from tab
在一個語句裡查詢得到列資料及其列名,自己想了半天,後來都開始懷疑自己這個想法是不是根本不可能實現,想得頭都大了。

最後匯出找資料庫大神來幫忙,大神給我的建議是從檢視下手,
於是我就去到查詢最開始的檢視去看,發現這裡的列名是不變的,可以給固定值。resultType=”java.util.Map”
結果查詢結果給我看懵了,原來這些怎麼查列名完全不用考慮,Mybatis裡已經做好了。

<select
id="getReportData" resultType="java.util.Map" >
<![CDATA[ select * from tabNm t ]]> </select>

查詢的結果每一行為List中的一個map,列名為key,結果資料為value。
兜了半天。原來這完全不用去特意處理SQL,好像SQL也不知道怎麼去處理這個問題。

後面還碰到查詢結果有漢字,有字母,格式化為固定長度寫到檔案的時候就對不起,需要字元格式轉換及填充空格,又被坑了一把。

最後的檔案寫入,及壓縮檔案,設定下載檔案都不是很困難。

總的來說,雖然兜了好幾個圈子,但是至少自己去思考了,去動手實踐了,感受到了分岔路上也有一番美好的景象,收穫到了更多經驗。