Map接收Mybatis的结果,字段1为Key,字段2为Val

Map接收Mybatis的结果,字段1为Key,字段2为Val

先上效果图

Map接收Mybatis的结果,字段1为Key,字段2为Val_第1张图片
Map接收Mybatis的结果,字段1为Key,字段2为Val_第2张图片

介绍

1.有时候我们想将mybatis查出来的数据封装到一个map中,从而循环list根据id直接从map中取值。但是mybatis默认封装的map是将字段作为map的key,字段对应的值作为map的值,sql查出一条数据可以,但是有多个结果集,就不能单纯用map来接收了,必须使用List>来接收,循环然后map.get,封装成map,见下图,无疑这么操作很是恶心。
Map接收Mybatis的结果,字段1为Key,字段2为Val_第3张图片
2.mybaits这么强大一个框架肯定邮箱对应的解决措施,在贵人的指导下,最终还是被我找到了解决措施。核心思想就是mybatis提供了一个名字叫做ResultHandler的结果处理器,他能感知到你的每条数据(可以当做limit 1来理解),拿到该条数据你加工下,继续拿下一条数据,有点类似于for循环,每次拿到数据放到map中,最后拿到这个map。接下来开始着手实现。
3.首先 xml写好sql,@select注解也可以,但是没有xml方便,因为需要返货resultMap
Map接收Mybatis的结果,字段1为Key,字段2为Val_第4张图片
这里我们查询id和name,返回类型是resultMap,然后新建个resultMap,id对应上,注意resultMap的类型是hashmap,将我们的id映射成key,name映射成value,这个key和value是做个标记,去的时候需要用到
4.新建个xml对应的接口,注意这里方法的形参为我自定义的一个类,有其他参数在这个参数之前写即可,这里的方法返回值必须为void返回进不去ResultHandle
Map接收Mybatis的结果,字段1为Key,字段2为Val_第5张图片
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;
    }
}

Map接收Mybatis的结果,字段1为Key,字段2为Val_第6张图片
这里的key和value是xml中映射的,这个类的大致意思就是新建一个mappedResults,每次感应到数据进来,处理下然后塞进去。
6.使用
Map接收Mybatis的结果,字段1为Key,字段2为Val_第7张图片
代码:

@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地址

本人小白,多多指教!有问题留言即可!

你可能感兴趣的:(Map接收Mybatis的结果,字段1为Key,字段2为Val)