mybatis第四天

1.1.ResultMap和ResultType

1.1.1.ResultType

resultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。 ,如果sql查询到的字段与pojo的属性名不一致,则需要使用resultMap将字段名和属性名对应起来,进行手动配置封装,将结果映射到pojo中 。

1
2
3
4
<!-- resultType实现-->
<select id="queryOrderUserByOrderNumber" resultType="com.lxy.mybatis.pojo.OrderUser">
select * from tb_order o left join tb_user u on o.user_id=u.id where o.order_number = #{number}
</select>

1.1.2.ResultMap

resultMap则是对外部ResultMap的引用 ,将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- resultmap实现 -->
<resultMap id="OrderUserResultMap" type="com.lxy.mybatis.pojo.Order" autoMapping="true">
<id property="id" column="id" />
<!-- association :配置一对一属性 -->
<!-- property:order里面的User属性名 -->
<!-- javaType:属性类型 -->
<association property="user" javaType="com.lxy.mybatis.pojo.User">
<!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->
<id property="id" column="user_id" />
<result property="userName" column="user_name"/>
</association>
</resultMap>


<select id="queryOrderWithUserByOrderNumber" resultMap="OrderUserResultMap" >
select * from tb_order o left join tb_user u on o.user_id=u.id where o.order_number = #{number}
</select>

因为在:

1
2
3
4
5
<association property="user" javaType="com.lxy.mybatis.pojo.User">
<!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->
<id property="id" column="user_id" />
<result property="userName" column="user_name"/>
</association>

中只为userName设定了关联,所以打印:

1
2
3
4
5
@Test
public void queryOrderWithUserByOrderNumber() throws Exception {
Order order = orderMapper.queryOrderWithUserByOrderNumber("123456");
System.out.println(order.getUser());
}

的时候只会打印出id 和 userName两个属性,其他的为null。

resultMap包含的元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->
<resultMap id="唯一的标识" type="映射的pojo对象">
<id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />
<result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>
<association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
<id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
<result column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/>
</association>
<!-- 集合中的property须为oftype定义的pojo对象的属性-->
<collection property="pojo的集合属性" ofType="集合中的pojo对象">
<id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
<result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />
</collection>
</resultMap>

1.2.一对多查询

新建OrderDetail类:

1
2
3
4
5
6
7
8
package com.lxy.mybatis.pojo;

public class OrderDetail {
private int id;
private int orderId;
private double totalPrice;
private int status;
}

修改Order类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.lxy.mybatis.pojo;

大专栏
上一篇:阿里巴巴编程规范——POJO使用包装类型


下一篇:创建Mybatis步骤