MyBatis 返回 Map,查询字段两列分别作为 key 和 value
原创
©著作权归作者所有:来自51CTO博客作者Dongguabai的原创作品,请联系作者获取转载授权,否则将追究法律责任
之前写过一篇博客,MyBatis 返回 Map 类型的结果,这种直接返回 Map 的结果,返回的结果是这样:
结果是返回一个 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>
数据库:
测试:
/**
* @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));
}}