MyBatis结果映射类resultMap

本文记录Java学习过程中遇到的MyBatis结果映射类resultMap~

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

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

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

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

示例代码(表结构):

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

示例代码(Order对象):

@Data
public class Order {

	// 订单id
	private int id;

	// 用户id
	private Integer userId;

	// 订单号
	private String number;

	// 订单创建时间
	private Date createtime;

	// 备注
	private String note;
}

示例代码(OrderMapper.xml):

<!-- 查询所有的订单数据 -->
<select id="queryOrderAll" resultType="order">
	SELECT id, user_id,
	number,
	createtime, note FROM `order`
</select>

示例代码(OrderMapper.java):

List<Order> queryOrderAll();

示例代码(OrderMapperTest.java):

@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);
	}
}

结果发现userid中都是null,因为表中是user_id,而类中是userId。此时,就需要resultMap了。

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

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

示例代码(OrderMapper.xml):

<!-- 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>

至此,问题解决。

标签: none