事情的起因是這樣的:今天在項目中查看mybatis框架的sql語句時候,看到接收參數和返回參數都是Map類型,這使得我突然眼前一亮,因為之前所接觸過的傳參和返回類型,除了java的常用數據類型之外,就是將傳入的參數和返回的數據映射到實體類中。因為之前都沒見過接受和返回都是map類型的(可能是因為我經驗缺乏,就是短淺啦)。這里附上圖片一張:

所以就去查看了一下資料。這里我就真理一下自己的理解。
1:返回數據。
返回為map類型的,其sql查詢出來的字段,即為map中的返回字段,map中通過鍵值對的方式存取這些數據,其key就是sql中所查詢的字段,當然,這里需要注意的一點就是,如果此字段為空,那么就不會返回此字段,記住,是不會返回,也就是說在map中的key並不存在這個字段,這個和返回實體類有一點區別,實體類中就算查詢出來的數據是空的,也能返回這個字段。
下面是我隨便寫的一個測試,目的就是看一下返回的字段:
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和李四的語文成績設為空,下面看返回的數據如下:
[
{
"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和返回映射到實體類的優缺點
優點:
首先從上述代碼就直接可以看出來,返回為map類型,使用Map作為接收類型時,通常能夠在傳參到持久層這一過程中省去很多麻煩。前端請求及參數到達Action或者Controller時通常使用map來進行接收,使用map作為傳遞類型可以不用再將數據封裝為Bean類型再去根據實體屬性一一填充,直接通過Service和Dao以map類型將數據傳到map配置SQL文件當中,省去很多數據轉換環節。
再執行完SQL語句返回時制定map類型返回,不管是單條數據還是List都可以快速編寫並返回給前端。這種方式在處理多表查詢時避免了編寫大量的實體類和屬性字段定義,減少了很多中間流程。
缺點:
缺點也一樣明顯,沒有了實體類,自己就需要記好map中的key-value映射關系,其次其數據不能像映射到實體類中那樣,重寫getter方法。當另外一個同事來接手和維護時,因為沒有了實體類,他只能通過查詢map調試,或者查看才能知曉。也不利於后期的維護。
