27MyBatis - 输出映射之ResultMap

简介: 27MyBatis - 输出映射之ResultMap

MyBatis输出映射之ResultMap

ResultMap概述

resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。

如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。

resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

小案例引出ResultMap

需求:查询订单表order的所有数据

SELECT id, user_id, number, createtime, note FROM `order`

1)声明pojo对象

2) Order对象:

public class Order {
  // 订单id
  private int id;
  // 用户id
  private Integer userId;
  // 订单号
  private String number;
  // 订单创建时间
  private Date createtime;
  // 备注
  private String note;
get/set。。。
}

3) Mapper.xml文件

创建OrderMapper.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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 -->
<mapper namespace="cn.itcast.mybatis.mapper.OrderMapper">
  <!-- 查询所有的订单数据 -->
  <select id="queryOrderAll" resultType="order">
    SELECT id, user_id,
    number,
    createtime, note FROM `order`
  </select>
</mapper>

4) Mapper接口

编写接口如下:

public interface OrderMapper {
  /**
   * 查询所有订单
   * 
   * @return
   */
  List<Order> queryOrderAll();
}

5) 测试方法

编写测试方法OrderMapperTest如下:

public class OrderMapperTest {
  private SqlSessionFactory sqlSessionFactory;
  @Before
  public void init() throws Exception {
    InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  }
  @Test
  public void testQueryAll() {
    // 获取sqlSession
    SqlSession sqlSession = this.sqlSessionFactory.openSession();
    // 获取OrderMapper
    OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
    // 执行查询
    List<Order> list = orderMapper.queryOrderAll();
    for (Order order : list) {
      System.out.println(order);
    }
  }
}

6) 运行结果

20190403171229600_.png

发现userId为null

解决方案:使用resultMap

resultMap的使用

由于上边的mapper.xml中sql查询列(user_id)和Order类属性(userId)不一致,所以查询结果不能映射到pojo中。

需要定义resultMap,把orderResultMap将sql查询列(user_id)和Order类属性(userId)对应起来

改造OrderMapper.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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 -->
<mapper namespace="cn.itcast.mybatis.mapper.OrderMapper">
  <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->
  <!-- id:设置ResultMap的id -->
  <resultMap type="order" id="orderResultMap">
    <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
    <!-- property:主键在pojo中的属性名 -->
    <!-- column:主键在数据库中的列名 -->
    <id property="id" column="id" />
    <!-- 定义普通属性 -->
    <result property="userId" column="user_id" />
    <result property="number" column="number" />
    <result property="createtime" column="createtime" />
    <result property="note" column="note" />
  </resultMap>
  <!-- 查询所有的订单数据 -->
  <select id="queryOrderAll" resultMap="orderResultMap">
    SELECT id, user_id,
    number,
    createtime, note FROM `order`
  </select>
</mapper>

运行结果:

20190403171339770_.png



目录
相关文章
|
2月前
|
XML Oracle Java
mybatis反向生成实体类、dao层以及映射文件
mybatis反向生成实体类、dao层以及映射文件
15 1
|
2月前
|
SQL Java 数据库连接
|
3月前
|
Java 数据库连接 Maven
使用mybatis插件generator生成实体类,dao层和mapper映射
使用mybatis插件generator生成实体类,dao层和mapper映射
64 0
|
4月前
|
SQL Java 数据库连接
MyBatis映射文件深入
MyBatis映射文件深入
62 0
|
4月前
|
SQL Java 数据库连接
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
【1月更文挑战第2天】 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
208 3
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
|
2月前
|
XML Java 数据库连接
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
91 0
|
12天前
|
SQL Java 数据库连接
15:MyBatis对象关系与映射结构-Java Spring
15:MyBatis对象关系与映射结构-Java Spring
31 4
|
18天前
|
SQL Java 数据库连接
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
|
28天前
|
XML Java 数据库连接
java对象有集合mybatis如何映射
java对象有集合mybatis如何映射
21 4
|
2月前
|
XML Java 数据库连接
mybatis的resultMap完美解析
mybatis的resultMap完美解析
26 0