这两天一直在纠结resultType与resultMap的使用场景的问题,当然也因为自己之前学的不扎实的原因,导致在做练手项目的时候不理解这里为什么要使用resultType,那里为什么要使用resultMap,看了很多博客,但是没有理解到其中的精髓,今天认真翻了翻直接写的mapper.xml文件,大概根据里面的信息总结了一下:
1.resultType的使用场景一般是在单表查询的时候,如果只是单表查询,一般则使用resultType,但是可以满足字段与属性并不需要一一对应,即查询的字段数与entity的属性个数可以不相同,依然能够得到查询结果。在表的字段名和entity的属性名不相同的时候,有两个解决方法:一是在写sql语句的时候,将查询的字段使用别名,如shop_name as shopName 这样也能够和实体类的属性一一对应;二是可以使用resultMap,而在这里,我认为这就是resultMap的第一个使用场景,解决表的字段名和实体类的属性名不相同的情况下,可以使用resultMap。那么在针对表的字段名和实体类的属性名不相同的情况,还有一种解决办法,就是在mybatis配置文件中配置<setting name="mapUnderscoretoCamelCase" value="true"/>,即开启驼峰命名转换,但是表的字段名和实体类的属性名必须要满足一定的命名规则,即刚刚所写的 shop_name 和shopName,这样就能够满足驼峰命名转换的规则。
2.resultMap的使用场景,一是能够解决刚刚的表字段名和实体类属性名不相同的问题,二就是能够解决多表连接查询的问题了,这也是resultType办不到的,即
<resultMap type="Product" id="productMap">
<id column="product_id" property="productId" />
<result column="product_name" property="productName" />
<result column="product_desc" property="productDesc" />
<result column="img_addr" property="imgAddr" />
<result column="normal_price" property="normalPrice" />
<result column="promotion_price" property="promotionPrice" />
<result column="priority" property="priority" />
<result column="create_time" property="createTime" />
<result column="last_edit_time" property="lastEditTime" />
<result column="enable_status" property="enableStatus" />
<association property="shop" column="shop_id" javaType="Shop">
<id column="shop_id" property="shopId" />
<result column="owner_id" property="ownerId" />
<result column="shop_name" property="shopName" />
</association>
<association property="productCategory" column="product_category_id"
javaType="ProductCategory">
<id column="product_category_id" property="productCategoryId" />
<result column="product_category_name" property="productCategoryName" />
</association>
<collection property="productImgList" column="product_id"
ofType="ProductImg">
<id column="product_img_id" property="productImgId" />
<result column="detail_img" property="imgAddr" />
<result column="img_desc" property="imgDesc" />
<result column="priority" property="priority" />
<result column="create_time" property="createTime" />
<result column="product_id" property="productId" />
</collection>
</resultMap>
<select id="queryProductById" resultMap="productMap"
parameterType="Long">
<!-- 具体的sql -->
SELECT
p.product_id,
p.product_name,
p.product_desc,
p.img_addr,
p.normal_price,
p.promotion_price,
p.priority,
p.create_time,
p.last_edit_time,
p.enable_status,
p.product_category_id,
p.shop_id,
pm.product_img_id,
pm.img_addr AS detail_img,
pm.img_desc,
pm.priority,
pm.create_time
FROM
tb_product p
LEFT JOIN
tb_product_img pm
ON
p.product_id =
pm.product_id
WHERE
p.product_id =
#{productId}
ORDER BY
pm.priority DESC </select>
这是我项目的一个sql语句,就直接贴过来了,因为在这次查询中也需要查询其他表中的字段,那么这时候就没有一个pojo类来与该查询结果对应,所以就需要使用到resultMap。然后在resultMap标签中有几个标签需要说明,第一个就是association,即联合、联系的意思,这是针对一对一或多对一的查询,而另一个就是collection,这是针对一对多的查询。注意一个问题,association标签中的对应pojo的属性名是javaType,而collection中是ofType,这是需要区分开的。同时,association和collection都是用于一个类中有另一个类作为其域属性的时候来使用的。