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不会修改或转义字符串。

相关文章
|
消息中间件 SQL 存储
超详细的RabbitMQ入门,看这篇就够了!
RabbitMQ入门,看这篇就够了
222486 69
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
24249 2
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
271659 0
|
SQL Java 数据库连接
【问题解决】nested exception is org.apache.ibatis.exceptions.TooManyResultException:Expected one result
【问题解决】nested exception is org.apache.ibatis.exceptions.TooManyResultException:Expected one result
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
408 6
|
消息中间件 存储 Java
吃透 RocketMQ 消息中间件,看这篇就够了!
本文详细介绍 RocketMQ 的五大要点、核心特性及应用场景,涵盖高并发业务场景下的消息中间件关键知识点。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
吃透 RocketMQ 消息中间件,看这篇就够了!
|
Java Spring
spring多线程实现+合理设置最大线程数和核心线程数
本文介绍了手动设置线程池时的最大线程数和核心线程数配置方法,建议根据CPU核数及程序类型(CPU密集型或IO密集型)来合理设定。对于IO密集型,核心线程数设为CPU核数的两倍;CPU密集型则设为CPU核数加一。此外,还讨论了`maxPoolSize`、`keepAliveTime`、`allowCoreThreadTimeout`和`queueCapacity`等参数的设置策略,以确保线程池高效稳定运行。
2674 11
spring多线程实现+合理设置最大线程数和核心线程数
|
Java UED Spring
Springboot通过SSE实现实时消息返回
通过Spring Boot实现SSE,可以简单高效地将实时消息推送给客户端。虽然SSE有其限制,但对于许多实时消息推送场景而言,它提供了一种简洁而强大的解决方案。在实际开发中,根据具体需求选择合适的技术,可以提高系统的性能和用户体验。希望本文能帮助你深入理解Spring Boot中SSE的实现和应用。
7360 1
|
Java 数据库连接 mybatis
成功解决: Invalid bound statement (not found) 在已经使用mybatis的项目里引入mybatis-plus,结果不能共存的解决
这篇文章讨论了在已使用MyBatis的项目中引入MyBatis-Plus后出现的"Invalid bound statement (not found)"错误,并提供了解决方法,主要是通过修改yml配置文件来解决MyBatis和MyBatis-Plus共存时的冲突问题。
成功解决: Invalid bound statement (not found) 在已经使用mybatis的项目里引入mybatis-plus,结果不能共存的解决