Mybatis 中的 resultMap 与 resultType、parameterMap 与 parameterType的区别

Mybatis 中 resultMap 与 resultType、parameterMap 与 parameterType的区别

ResultMap和ResultType,

它们都是用来表示查询结果集与java对象之间的一种关系,将查询结果集,按照某种关系映射到java对象。

ResultMap

将查询结果集中的列一一映射到java对象的各个属性上去,此处的这个映射关系,是根据用户在“resultMap”的子标签中的配置来决定的,灵活多变,常用于多表查询以及查询时使用别名的情况。

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

resultType

表示的是bean中的对象类,此时可以省略掉resultMap标签的映射,但是必须保证查询结果集中的属性 和 bean对象类中的属性是一一对应的,此时大小写不敏感,但是有限制。

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

	<selectid="queryMessageList"parameterType="hdu.terence.bean.Message"   resultType=" hdu.terence.bean.Message ">
    SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1      
    <iftest="command!=null and!"".equals(command.trim())">
    andCOMMAND=#{command}
    </if>
    <iftest="description!=null and!"".equals(description.trim())">
    andDESCRIPTION like '%' #{description} '%'
    </if> 
  </select>

ParameterMap(不推荐) &和parameterType :

ParameterMap和ResultMap类似,设置入参字段映射,很少使用(不建议使用) 一般使用parameterType直接将查询结果列值类型自动对应到java对象属性类型上,不再配置映射关系一一对应。

	<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from litemall_order
    where id = #{id,jdbcType=INTEGER}
  </select>


	<select id="selectByExampleSelective" parameterType="map" resultMap="BaseResultMap">
    select
    <if test="example.distinct">
      distinct
    </if>
    <choose>
      <when test="selective != null and selective.length > 0">
        <foreach collection="selective" item="column" separator=",">
          ${column.aliasedEscapedColumnName}
        </foreach>
      </when>
      <otherwise>
        <include refid="Base_Column_List" />
      </otherwise>
    </choose>
    from litemall_order
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
    <if test="example.orderByClause != null">
      order by ${example.orderByClause}
    </if>
  </select>

Mybatis使用ResultMap和ResultType、ParameterMap和ParameterType:

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

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

#{}和${}的使用:

  1. resultMap和ParameterMap书写拼写要使用#{}

  2. resultType 和parameterType类型使用${}

例子如下(参数:usernam):

Select ID,COMMAND from Message where COMMAND=#{usernam}

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

前者解析为:

         Select  *  from user where username =# 具有预编译效果

后者解析为:

        Select  *  from user where username =张三   # 不具有预编译效果

mybatis中的#和$的区别

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.

  2. $将传入的数据直接显示生成在sql中。如:order by u s e r i d user_id userid,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.

  3. #方式能够很大程度防止sql注入。

  4. $方式无法防止Sql注入。

  5. $方式一般用于传入数据库对象,例如传入表名.

  6. 一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

这里MyBatis不会修改或转义字符串。

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值