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:
-
Mybatis出生于GoogleCode,使用的这两个名字叫做resultType和parameterType。
-
以前的版本叫做iBatis,出生于Apache,以前这两个配置叫做resultClass和parrameterClass,根据这种命名也应该知道这种映射都和java类有关。
#{}和${}的使用:
-
resultMap和ParameterMap书写拼写要使用#{}
-
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中的#和$的区别
-
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”.
-
$将传入的数据直接显示生成在sql中。如:order by u s e r i d user_id userid,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
-
#方式能够很大程度防止sql注入。
-
$方式无法防止Sql注入。
-
$方式一般用于传入数据库对象,例如传入表名.
-
一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。