mybatis 一对多关联查询-返回map

概述

一对多查询语句:

select  p.id,p.title,p.create_time,p.user_id,u.username from user u,post p where u.id=p.user_id

查询发帖的 id、标题、创建时间、用户id、用户名
其中用户名在 user 表中,其他字段在 post 表中

难点

如何配置下面的 resultType:

<select id="query" resultType="?">
    select  p.id,p.title,p.create_time,p.user_id,u.username from user u,post p where u.id=p.user_id
</select>

由于查询的字段分别在2个实体类中,所以此处配置哪个实体类,都不合理,所以此处配置的是 map

优点

配置简单

缺点

由于返回的是 map 类型,需要知道key,所以取值麻烦

修改 IPostMapper

public List<Map> query();

修改 postMapper.xml

<select id="query" resultType="map">
    select  p.id,p.title,p.create_time,p.user_id,u.username from user u,post p where u.id=p.user_id
</select>

测试

@Test
public void testSelect() throws IOException {

    InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    IPostMapper mapper = sqlSession.getMapper(IPostMapper.class);

    List<Map> list=mapper.query();
    for(Map map:list) {
        String info = String.format("id:%s,用户名:%s,标题:%s", map.get("id"), map.get("username"), map.get("title"));
        System.out.println(info);
    }
    sqlSession.close();
    inputStream.close();
}

原文出处:/show_1IXGHsv9O1.html