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