MyBatis-Plus 查詢返回實體物件還是map
在常見場景下:返回資料建議使用map,不建議使用實體物件
/** * 1. 名字包含雨並且年齡小於40 * sql:name like '%雨%' and age < 40 * <p> * 應用場景: * 當表字段非常多,但是你只需要查詢少數幾列,* 沒必要返回的泛型為實體的list,如果返回的泛型為實體,絕大多欄位都是null,這樣做不優雅 * 用返回泛型為map建議使用 */ @Test public void selectByWrapperMaps() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name","雨").lt("age",40); //建議使用 List<Map<String,Object>> userList = userMapper.selectMaps(queryWrapper); //不建議使用 // List<User> userList = userMapper.selectList(queryWrapper); userList.forEach(System.out::println); } /* sql形式:SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? */
/** * 按照直屬上級分組,查詢每組的平均年齡。最大年齡、最小年齡。 * 並且只取年齡總和小於500的組 * select avg(age) avg_age,min(age) min_age,max(age) max_age from user * group by manager_id * having sum(age) < 500 ; */ @Test public void selectByWrapperMaps2() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.select("avg(age) avg_age","min(age) min_age","max(age) max_age") .groupBy("manager_id") .having("sum(age) < {0}",500); List<Map<String,Object>> userList = userMapper.selectMaps(queryWrapper); userList.forEach(System.out::println); // sql形式:SELECT avg(age) avg_age,max(age) max_age FROM user // GROUP BY manager_id HAVING sum(age) < ? }
遇到了這個問題,迷惘,遂問大神,大神曰:如果是組合體,就用map;如果是單體實體,就用實體。實體類對應單表,多表返回用map。
我想省事全用map,但是那我學了面向物件是用來幹嘛的?
別人在呼叫你這個介面的時候 ,如果返回型別是個map,那他需要點進去,看你程式的具體實現才能知道怎麼接收,賦值,那無疑是為別人添加了巨大麻煩,尤其是當你的程式碼不夠規範的時候。再有,如果你程式碼寫的很爛,豈不是自己去讓別人吐槽你。如果你返回的是一個物件實體,那他就可以看到你返回的是什麼,別人也就懶得再去看你程式碼了,也為他省了很多事。
新技術或者新思想 並不等於 省事 ,很多時候 有捷徑,但是,我們就是不能去走,為什麼?說不定走到哪裡就會遇到一個坑,或者直接是懸崖也不一定。
其他回答:
1.每張表都要對應一個實體 這樣才能對映嘛 多表聯合查詢的結果可以返回一個hashmap處理 視情況而定。
2.如果你是多表聯合查詢,然後你又覺得返回方式用map很麻煩的話,你可以自己建立個實體類,這個實力類中包含有你所要查詢的多表中的欄位,然後在mybatis中用typeAlias指定一下,到時候,就能像用一般的實體類那樣使用就好。
3.如果型別指定為hashMap只是針對返回一條記錄的情況吧,如果返回多條記錄型別就不能指定為hashMap了?多個結果集他會給你放入一個List,你在javacode中用selectList這樣的程式碼返回的是list,當然這個list中可能是實體類也可能是hashmap。
到此這篇關於MyBatis-Plus 查詢返回實體物件還是map的文章就介紹到這了,更多相關MyBatis-Plus 查詢返回內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!