resultMap 与 resultType、parameterMap 与 parameterType的区别

简介: resultMap 与 resultType、parameterMap 与 parameterType的区别

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>
v

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 $user_id$,如果传入的值是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不会修改或转义字符串。

相关文章
|
3月前
|
SQL Java 数据库连接
ResultSet
ResultSet
17 0
|
7月前
|
SQL Java 数据库连接
【MyBatis】动态SQL > 重点:${...}和#{...}与resultMap和resultType的区别
【MyBatis】动态SQL > 重点:${...}和#{...}与resultMap和resultType的区别
92 0
|
SQL XML Java
Mybatis开发要点-resultType和resultMap的区别?
Mybatis开发要点-resultType和resultMap的区别?
88 0
|
SQL Java 数据库连接
ResultMap与ResultType的区别
ResultMap与ResultType的区别
ResultMap与ResultType的区别
|
JavaScript 开发者
res.setHeader 方法和 res.writeHead 方法|学习笔记
快速学习 res.setHeader 方法和 res.writeHead 方法
517 0
|
SQL 存储 Java
ResultSet/ResultSetMetaData相关和用法
ResultSet/ResultSetMetaData相关和用法
|
SQL Java 关系型数据库
|
关系型数据库 Java 数据库连接
|
JSON Java 数据库连接