事情的原由是這樣的:今天在項目中查看mybatis框架的sql語句時候,看到接收參數和返回參數都是Map類型,這使得我忽然眼前一亮,由於以前所接觸過的傳參和返回類型,除了java的經常使用數據類型以外,就是將傳入的參數和返回的數據映射到實體類中。由於以前都沒見過接受和返回都是map類型的(多是由於我經驗缺少,就是短淺啦)。這裏附上圖片一張:前端
因此就去查看了一下資料。這裏我就真理一下本身的理解。java
1:返回數據。sql
返回爲map類型的,其sql查詢出來的字段,即爲map中的返回字段,map中經過鍵值對的方式存取這些數據,其key就是sql中所查詢的字段,固然,這裏須要注意的一點就是,若是此字段爲空,那麼就不會返回此字段,記住,是不會返回,也就是說在map中的key並不存在這個字段,這個和返回實體類有一點區別,實體類中就算查詢出來的數據是空的,也能返回這個字段。json
下面是我隨便寫的一個測試,目的就是看一下返回的字段:mybatis
sql語句以下:框架
1 <select id="testResultMap" resultType="java.util.Map"> 2 SELECT 3 student.*, 4 grade.c_fs, 5 grade.c_kc 6 FROM 7 student 8 LEFT JOIN grade ON grade.c_stuId = student.id 9 </select>
student表字段和grade表字段和數據以下:測試
這裏爲了驗證數據爲空時候,是否返回此字段,我專門把張三的goTime和李四的語文成績設爲空,下面看返回的數據以下:spa
[
{
"classes":"五年級一班",
"id":2,
"c_fs":100,
"sex":1,
"c_kc":"數學",
"age":211,
"userName":"張三"
},
{
"classes":"五年級二班",
"id":3,
"goTime":"2018-12-31",
"sex":0,
"c_kc":"語文",
"age":212,
"userName":"李四"
}
]
能夠看到,字段就是sql裏面查詢的字段裏面張三的goTime和李四的c_fs直接沒有返回,這也驗證了以前所說的字段爲空直接不返回此字段。調試
2:返回map和返回映射到實體類的優缺點code
優勢:
首先從上述代碼就直接能夠看出來,返回爲map類型,使用Map做爲接收類型時,一般可以在傳參到持久層這一過程當中省去不少麻煩。前端請求及參數到達Action或者Controller時一般使用map來進行接收,使用map做爲傳遞類型能夠不用再將數據封裝爲Bean類型再去根據實體屬性一一填充,直接經過Service和Dao以map類型將數據傳到map配置SQL文件當中,省去不少數據轉換環節。
再執行完SQL語句返回時制定map類型返回,無論是單條數據仍是List均可以快速編寫並返回給前端。這種方式在處理多表查詢時避免了編寫大量的實體類和屬性字段定義,減小了不少中間流程。
缺點:
缺點也同樣明顯,沒有了實體類,本身就須要記好map中的key-value映射關係,其次其數據不能像映射到實體類中那樣,重寫getter方法。當另一個同事來接手和維護時,由於沒有了實體類,他只能經過查詢map調試,或者查看才能知曉。也不利於後期的維護。