关于#{}
“#{}” 在MyBatis中代表一种占位符,它可以接受输入的参数,在大括号中编写参数名称来接受对应的参数。它接受的类型可以是:基本数据类型、包装数据类型、普通的JavaBean类型或者HashMap类型。
- 当接受简单类型时,"#{}" 中可以写 “value” 或者其他任意的参数名,因为Java反射只能获取方法参数的类型,但是无法得知方法参数的名字,如下所示:
<select id="selUserById" parameterType="int" resultType="com.mandy.pojo.User">
SELECT * FROM USER WHERE id=#{id}
</select>
- 当接受多个参数时
(1)MyBatis会自动把传入的参数封装成一个map,默认通过“param1、param2··· ···”或者索引(0、1、2…)的方式获取对象属性值,其中 “param1” 和 “0” 的意义是一样的,都表示输入Map的第一个参数:
UserMapper.java接口中定义的方法如下:
User selUserById(Integer minId, Integer maxId);
UserMapper.xml中:
<select id="selUserById" parameterType="java.util.Map" resultType="com.mandy.pojo.User">
SELECT * FROM User where id>#{param1} AND id<#{param2}
</select>
(2)但是也可以是某个特定的key值来引用value,这就需要用@Param()注解了:
UserMapper.java接口中定义的方法如下:
User selUserById(@Param("minId")Integer minId, @Param("maxId")Integer maxId);
UserMapper.xml文件中:
<select id="selUserById" parameterType="java.util.Map" resultType="com.mandy.pojo.User">
SELECT * FROM User where id>#{minId} AND id<#{maxId}
</select>
(3)也可以把传入的参数包装成一个map:
UserMapper.java接口中定义的方法:
User selUserById(Map<String,Integer> map);
调用时的方法:
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("minId',5);
map.put("maxId",12");
User selUserById(map);
UserMapper.xml文件中:
<select id="selUserById" parameterType="java.util.Map" resultType="com.mandy.pojo.User">
SELECT * FROM User where id>#{minId} and id<#{maxId}
</select>
- 当接受的是JavaBean类型时,“#{}" 中可以通过 #{属性名} 来调用相对应的属性值:
<insert id="insUser" parameterType="com.mandy.pojo.User" >
INSERT INTO User(id,name,age,password) VALUES(#{id},#{name},#{age},#{password})
</insert>
关于${}
“$ { }” 符号,表示拼接SQL语句串,即把接收的参数内容不加任何修饰地拼接在SQL中,不使用“?”占位符(直接拼接,不需要占位)。"${}" 接受的参数类型可以是简单类型,普通JavaBean或者HashMap。
但是要注意的是,使用 “$ { }” 拼接符号拼接SQL语句,会引起SQL注入,所以一般不建议使用 “$ { }”。
- 当接受简单类型时,"${}" 中只能写"value",而不能是其他的名称!!!
这与"#{}"要区别开来,下面是一个模糊查询的例子:
<select id="selUserByName" parameterType="java.lang.String" resultType="com.mandy.pojo.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
- 当接受JavaBean类型时,它会通过OGNL读取对象中的属性值(这点与"#{}"是一样的):
<insert id="insUser" parameterType="com.mandy.pojo.User" >
INSERT INTO User(id,name,age,password) VALUES(${id},${name},${age},${password})
</insert>
接受HashMap类型略。。。
总结
- "#{}"在SQL配置文件中,输入参数需要用占位符来标识对应的位置;
- “$ { }“在SQL配置文件中代表一个“拼接符号”,可以在原有SQL语句上拼接新的符合SQL语法的语句,一般用来模糊查询,平时应该尽量避免使用”$ { }”,因为它容易引起SQL注入。