resultMap与resultType、parameterMap与 parameterType的区别

Map:映射;Type:Java类型

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

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

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

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

 

<!-- 订单查询关联用户的resultMap将整个查询的结果映射到cn.itcast.mybatis.po.Orders中   -->  
    <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">  
        <!-- 配置映射的订单信息 -->  
        <!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id ,column:订单信息的唯 一标识列 ,property:订单信息的唯 一标识 列所映射到Orders中哪个属性  -->  
 
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/> 
        <result column="number" property="number"/> 
        <result column="createtime" property="createtime"/>
        <result column="note" property=note/>          
 
        <!-- 配置映射的关联的用户信息 --> 
        <!-- association:用于映射关联查询单个对象的信息property:要将关联查询的用户信息映射到Orders中哪个属性 -->  
 
        <association property="user"  javaType="cn.itcast.mybatis.po.User">
            <!-- id:关联查询用户的唯 一标识
            column:指定唯 一标识用户信息的列
            javaType:映射到user的哪个属性-->
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        </association> 
    </resultMap>

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

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

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

例如:

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

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

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

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

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

 <select id="queryMessageList" parameterType="hdu.terence.bean.Message"   resultType=" hdu.terence.bean.Message ">
    SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1     
    <if test="command!=null and!"".equals(command.trim())">
    and COMMAND=#{command}
    </if>
    <if test="description!=null and!"".equals(description.trim())">
    and DESCRIPTION like '%' #{description} '%'
    </if> 
  </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类型使用${},使用例子如下:
 

Select ID,COMMAND from Message where COMMAND=#{command}
Select ID,COMMAND from Message where COMMAND=‘${command}’

前者解析为:

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

后者解析为:

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

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

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

#{}和 ognl表达式     

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


--------------------- 
作者:Terence_Jing 
来源:CSDN 
原文:https://blog.csdn.net/CSDN_Terence/article/details/60779889 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值