Map接收Mybatis的结果,字段1为Key,字段2为Val
先上效果图
介绍
1.有时候我们想将mybatis查出来的数据封装到一个map中,从而循环list根据id直接从map中取值。但是mybatis默认封装的map是将字段作为map的key,字段对应的值作为map的值,sql查出一条数据可以,但是有多个结果集,就不能单纯用map来接收了,必须使用List<Map<K,V>>来接收,循环然后map.get,封装成map,见下图,无疑这么操作很是恶心。
2.mybaits这么强大一个框架肯定邮箱对应的解决措施,在贵人的指导下,最终还是被我找到了解决措施。核心思想就是mybatis提供了一个名字叫做ResultHandler的结果处理器,他能感知到你的每条数据(可以当做limit 1来理解),拿到该条数据你加工下,继续拿下一条数据,有点类似于for循环,每次拿到数据放到map中,最后拿到这个map。接下来开始着手实现。
3.首先 xml写好sql,@select注解也可以,但是没有xml方便,因为需要返货resultMap
这里我们查询id和name,返回类型是resultMap,然后新建个resultMap,id对应上,注意resultMap的类型是hashmap,将我们的id映射成key,name映射成value,这个key和value
是做个标记,去的时候需要用到
4.新建个xml对应的接口,注意这里方法的形参为我自定义的一个类,有其他参数在这个参数之前写即可,这里的方法返回值必须为void返回进不去ResultHandle
5.新建自定义ResultHandle
@SuppressWarnings("all")
public class MapResultHandler<K,V> implements ResultHandler<Map<K,V>> {
private final Map<K,V> mappedResults = new HashMap<>();
@Override
public void handleResult(ResultContext context) {
Map map = (Map) context.getResultObject();
mappedResults.put((K)map.get("key"), (V)map.get("value"));
}
public Map<K,V> getMappedResults() {
return mappedResults;
}
}
这里的key和value是xml中映射的,这个类的大致意思就是新建一个mappedResults,每次感应到数据进来,处理下然后塞进去。
6.使用
代码:
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestMapper {
@Autowired
private UserMapper userMapper;
@Test
public void mybatisMapTest() {
MapResultHandler<Integer, String> resultHandler = new MapResultHandler<>();
userMapper.data(resultHandler);
Map<Integer, String> map = resultHandler.getMappedResults();
System.out.println("map = " + map);
}
}
末尾
giee地址:gitee地址
本人小白,多多指教!有问题留言即可!