先大概說明一下ResultMap
和ResultType
的使用場景
- ResultMap適用于復雜的查詢,可以處理多表關聯查詢、嵌套查詢等情況。通過ResultMap,可以更精確地控制查詢結果的映射。
- ResultType適用于簡單的查詢,而ResultMap適用于復雜的查詢。具體使用哪種方式,取決于查詢結果的結構和映射需求。
ResultType
的值一般采用別名方式:
- 對于引用數據類型,都是將大寫字母轉小寫,如java.lang.String對應的別名是’string’;HashMap對應的別名是’hashmap’
- 對于基本數據類型,考慮到重復的問題,會在其前面加上_,如int對應的別名是’_int’;boolean對應的別名是’_boolean’
在業務開發中,我們可能會遇到這樣的需求:在對數據進行操作時,先判斷有沒有對應的記錄,如果有,再進行操作。實現的方式有多種,現針對mybatis的實現進行說明。
Mapper方法
//是否存在當前狀態的訂單
boolean existsOrder(@Param("orderStatus") String orderStatus);
<select id="existsOrder" parameterType="String" resultType="_boolean">select count(`id`)from `order`where `status` = #{orderStatus}
</select>
Mybatis是根據查詢到的記錄數進行轉換的(1表示為true,0表示為false) 。然而,如果查詢到多條記錄(大于1),則返回的布爾值為false。
這個和mysql的版本有關系,故為了兼容版本我們可以考慮做如下sql改造使用 limit 1
限制只查一條數據。
<select id="existsOrder" parameterType="String" resultType="_boolean">select count(1)from (select 1from `order`where `status` = #{orderStatus} limit 1) t_
</select>
測試方法:
@Test
public void testExistsOrder(){//如果查詢到則返回true;否則返回falseboolean existsUnfishedOrder = orderMapper.existsOrder("unfinished");if (existsUnfishedOrder){// 業務邏輯} else {throw new Exception("不存在符合條件的訂單!");}
}