preparedStatement:
支持通配符赋值,可以预编译sql语句
statement:
必须使用字符串拼接的方式操作sql语句,不能使用通配符,因为statement对象调用executeQuery(String sql)直接执行sql语句.
因此,在使用#{}传输实体类对象时,有字符串的地方不用加单引号’’,而使用${}拼接字符串时需要手动加上单引号’’.
在传输实体类对象使用#{}时:
< insert>
insert into user values (null,#{name},#{age},#{gender})
< /insert>
sql执行时转化为以下:
sql:insert into user values (null,?,?,?);
在传输实体类对象使用${}时:有字符串的地方使用单引号哦
< insert>
insert into user values (null,'${name}',${age},'${gender}')
< /insert>
执行时转化为以下:
sql:insert into user values (null,'张三',12,'男');
在传输单个String类型或基本数据类型时,因为#{}是通配符进行赋值,所以#{}里面的内容无论写什么,mybatis都可以进行赋值,但是建议与属性名保持一致
<select id="getUserByUid">
select * from user where uid=#{uid}
</select>
而${}在传输单个String类型或者基本数据类型时, $ {}里面只能填写value或者_parameter
<select id="getUserByUid">
select * from user where uid=${value}
</select>
传递不同参数类型,#{}和${} 的不同取值方式:
1,当传输类型为实体类对象时:
#{}和 $ {}都可以通过属性名直接获取参数值,但是要注意${}的单引号问题
2,当传输类型为单个字符串或者基本数据类型时:
#{} 可以通过属性名直接获取参数值
${}里面的值只能是value或者_parameter3,当传输多个参数时:Mybatis会默认将这些参数放在map集合中,键为0,1,2…或者param1,param2,param3…
#{}:可以通过#{0},#{1};#{param1},#{param2}来获取参数值
${}:只能通过 ${param1}, ${param2}来获取参数值