之前写过一篇博客,MyBatis 返回 Map 类型的结果,这种直接返回 Map 的结果,返回的结果是这样:

MyBatis 返回 Map,查询字段两列分别作为 key 和 value_xml

结果是返回一个 Map,Map 的 Entry 为“字段名-字段值,字段名-字段值”。

但是有时候我们需要的是返回的是 key-value,key 和 value 是返回的两列数据的映射关系。这时候可以这么做:

自定义 Handler 实现 ResultHandler:

/**
* @author dongguabai
* @Description
* @Date 创建于 2019-05-15 22:14
*/
public class MapResultHandler implements ResultHandler {
private final Map mappedResults = new HashMap();

@Override
public void handleResult(ResultContext context) {
@SuppressWarnings("rawtypes")
Map map = (Map)context.getResultObject();
mappedResults.put(map.get("key"), map.get("value"));
}

public Map getMappedResults() {
return mappedResults;
}
}

Mapper(为了特别说明当方法带有参数的时候的情况,这里加了一个查询的 Query):

public interface UserAccountMapper extends BaseMapper<UserAccount> {

Map<String,String> testType(UserQuery query);
}

xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.zj.bda.persistence.mapper.UserAccountMapper">


<resultMap id="mapResult" type="java.util.HashMap">
<result property="key" column="username"/>
<result property="value" column="balance" />
</resultMap>

<select id="testType" parameterType="com.zj.bda.persistence.query.UserQuery" resultMap="mapResult">
select username,balance from user_account where username = #{username} and balance = #{balance}

</select>

</mapper>

数据库:

MyBatis 返回 Map,查询字段两列分别作为 key 和 value_Test_02

测试:

/**
* @author Dongguabai
* @date 2018/10/8 10:25
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootSpringTest {

@Autowired
private SqlSessionFactory sqlSessionFactory;

@Test
public void test2(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
MapResultHandler handler = new MapResultHandler();
UserQuery userQuery = new UserQuery("zhangsan",2000);
sqlSession.select("com.zj.bda.persistence.mapper.UserAccountMapper.testType",userQuery,handler);
//获取结果
handler.getMappedResults().forEach((k,v)-> System.out.println("k:"+k+",v:"+v));
}}