mybatis預設結果集封裝邏輯是將一行資料封裝成一個javabean,多行資料封裝成List。如果我們想要自己定義,該咋辦呢?
舉個沒啥用的示例
現資料庫有表如下:
userid | name |
---|---|
1 | liuyu |
2 | tong |
3 | jeccy |
一般情況下我們會定義javabean:
public class User {
private Integer user_id;
private String name;
}
複製程式碼
sql語句:
//mapper方法
List<User> getUser();
<resultMap id="user" type="org.mybatis.***.mapper.User">
<result column="user_id" property="user_id"/>
<result column="name" property="name"/>
</resultMap>
<select id="getUser" resultMap="user">
select user_id,name from develop_test
</select>
複製程式碼
這樣的話取出的結果集是一個list,但是像這種只有兩列資料的,map顯然更適合操作,比如我想獲取id為2的name,list需要遍歷,map直接獲取就成。
改造如下,自定義結果集處理器:
public class MapHandle implements ResultHandler<User> {
private Map<Integer,String> result = new HashMap<>();
@Override
public void handleResult(ResultContext<? extends User> resultContext) {
User user = resultContext.getResultObject();
result.put(user.getUser_id(),user.getName());
}
public Map<Integer, String> getResult() {
return result;
}
}
複製程式碼
mapper中方法需要做如下修改:
//返回值必須為void,將ResultHandler作為引數傳入。
void getUser(ResultHandler<User> handler);
複製程式碼
sql語句和resultmap不需要修改,這樣我們就可以直接獲取一個map的結果集了。
MapHandle handle = new MapHandle();
mapper.getUser(handle);
Map<Integer, String> result = handle.getResult();
複製程式碼