resultMap与resultType、parameterMap与 parameterType的区别

ゝ一纸荒年。 2022-09-27 06:26 245阅读 0赞

Map:映射;Type:Java类型

resultMap 与 resultType、parameterMap 与 parameterType的区别在面试的时候被问到的几率非常高,出现的次数到了令人发指的地步,笔者认为有必要单独列一章郑重声明,共勉

resultMap & resultType

两者都是表示查询结果集java对象之间的一种关系,处理查询结果集,映射到java对象。

resultMap 是一种“查询结果集—-Bean对象”属性名称映射关系,使用resultMap关系可将将查询结果集中的列一一映射到bean对象的各个属性(两者属性名可以不同,配置好映射关系即可),适用与复杂一点的查询。

(1)适用于表的连接查询(在resultMap里面可以配置连接条件,见如下程序association标签)

  1. <!-- 订单查询关联用户的resultMap将整个查询的结果映射到cn.itcast.mybatis.po.Orders中 -->
  2. <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">
  3. <!-- 配置映射的订单信息 -->
  4. <!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id ,column:订单信息的唯 一标识列 ,property:订单信息的唯 一标识 列所映射到Orders中哪个属性 -->
  5. <id column="id" property="id"/>
  6. <result column="user_id" property="userId"/>
  7. <result column="number" property="number"/>
  8. <result column="createtime" property="createtime"/>
  9. <result column="note" property=note/>
  10. <!-- 配置映射的关联的用户信息 -->
  11. <!-- association:用于映射关联查询单个对象的信息property:要将关联查询的用户信息映射到Orders中哪个属性 -->
  12. <association property="user" javaType="cn.itcast.mybatis.po.User">
  13. <!-- id:关联查询用户的唯 一标识
  14. column:指定唯 一标识用户信息的列
  15. javaType:映射到user的哪个属性-->
  16. <id column="user_id" property="id"/>
  17. <result column="username" property="username"/>
  18. <result column="sex" property="sex"/>
  19. <result column="address" property="address"/>
  20. </association>
  21. </resultMap>

(2)适用于表的一对多连接查询,(如,订单对应多个订单明细时,需要根据连接条件订单id匹配订单明细,并且消除重复的订单信息(订单明细中的),如下程序);

  1. <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
  2. <!-- 订单信息 -->
  3. <!-- 用户信息 -->
  4. <!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->
  5. <!-- 订单明细信息一个订单关联查询出了多条明细,要使用collection进行映射
  6. collection:对关联查询到多条记录映射到集合对象中
  7. property:将关联查询到多条记录映射到cn.itcast.mybatis.po.Orders哪个属性
  8. ofType:指定映射到list集合属性中pojo的类型 -->
  9. <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
  10. <!-- id:订单明细唯 一标识
  11. property:要将订单明细的唯 一标识 映射到cn.itcast.mybatis.po.Orderdetail的哪个属性-->
  12. <id column="orderdetail_id" property="id"/>
  13. <result column="items_id" property="itemsId"/>
  14. <result column="items_num" property="itemsNum"/>
  15. <result column="orders_id" property="ordersId"/>
  16. </collection>
  17. </resultMap>

(3)映射的查询结果集中的列标签可以根据需要灵活变化,并且,在映射关系中,还可以通过typeHandler设置实现查询结果值的类型转换,比如布尔型与0/1的类型转换。

例如:

  1. <resultMaptype="hdu.terence.bean.Message" id="MessageResult">
  2. <!--存放Dao值--><!--type是和数据库对应的bean类名Message-->
  3. <id column="id" jdbcType="INTEGER"property=" id"/><!--主键标签-->
  4. <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
  5. <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
  6. <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
  7. </resultMap>
  8. <select id="queryMessageList" parameterType="hdu.terence.bean.Message" resultMap="MessageResult">
  9. SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1
  10. <if test="command!=null and!"".equals(command.trim())">
  11. and COMMAND=#{command}
  12. </if>
  13. <if test="description!=null and!"".equals(description.trim())">
  14. and DESCRIPTION like '%' #{description} '%'
  15. </if>
  16. </select>

resultType是一种“查询结果集—-Bean对象”数据类型映射关系,使用resultType关系,即可使Bean对象接收查询结果集;见名知意,该方法是通过查询结果集中每条记录(属性)的数据类型和Bean对象的数据类型作映射,若两者都相同,则表示匹配成功,Bean可以接收到查询结果。

但是刚方法有局限性,要求Bean对象字段名和查询结果集的属性名相同(可以大小写不同,大小写不敏感)。因为这个局限性,可以省略调resultMap进行属性名映射。

一般适用于pojo(简单对象)类型数据,简单的单表查询。

以下是resultType的写法,将其值设置成对应的java类上即可。不需要上述resultMap的映射关系。

  1. <select id="queryMessageList" parameterType="hdu.terence.bean.Message" resultType=" hdu.terence.bean.Message ">
  2. SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1
  3. <if test="command!=null and!"".equals(command.trim())">
  4. and COMMAND=#{command}
  5. </if>
  6. <if test="description!=null and!"".equals(description.trim())">
  7. and DESCRIPTION like '%' #{description} '%'
  8. </if>
  9. </select>

ParameterMap(不推荐) & parameterType

ParameterMap和resultMap类似,表示将查询结果集中列值的类型一一映射到java对象属性的类型上,在开发过程中不推荐这种方式。

一般使用parameterType直接将查询结果列值类型自动对应到java对象属性类型上,不再配置映射关系一一对应,例如上述代码中下划线部分表示将查询结果类型自动对应到hdu.terence.bean.Message的Bean对象属性类型。

Mybatis家族历史

Mybatis出生于GoogleCode,使用的这两个名字叫做resultType和parameterType。

以前的版本叫做iBatis,出生于Apache,以前这两个配置叫做resultClass和parrameterClass,根据这种命名也应该知道这种映射都和java类有关。

#{}和${}的使用

resultMap和ParameterMap书写拼写要使用#{},resultType 和parameterType类型使用${},使用例子如下:

  1. Select IDCOMMAND from Message where COMMAND=#{command}
  2. Select IDCOMMAND from Message where COMMAND=‘${command}’

前者解析为:

Select ID,COMMAND from Message where COMMAND=?具有预编译效果

后者解析为:

Select ID,COMMAND from Message where COMMAND=段子 不具有预编译效果

但是,例如当页面向后台传递一个列名(属性名)的时候,是不希望被预编译出一个?的,此时要用到$格式;

如:加上 order by${param} ,此时param是一个列名。

" class="reference-link">#{}和 ognl表达式 SouthEast

一般参数的拼写还是保证统一风格为好,便于人读。

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读