在MyBatis映射文件中,#{}与${}的区别

关于#{}

“#{}” 在MyBatis中代表一种占位符,它可以接受输入的参数,在大括号中编写参数名称来接受对应的参数。它接受的类型可以是:基本数据类型、包装数据类型、普通的JavaBean类型或者HashMap类型。

  1. 当接受简单类型时,"#{}" 中可以写 “value” 或者其他任意的参数名,因为Java反射只能获取方法参数的类型,但是无法得知方法参数的名字,如下所示:

  1. 当接受多个参数时

(1)MyBatis会自动把传入的参数封装成一个map,默认通过“param1、param2··· ···”或者索引(0、1、2…)的方式获取对象属性值,其中 “param1” 和 “0” 的意义是一样的,都表示输入Map的第一个参数:

UserMapper.java接口中定义的方法如下:

    User selUserById(Integer minId, Integer maxId);

UserMapper.xml中:


(2)但是也可以是某个特定的key值来引用value,这就需要用@Param()注解了:

UserMapper.java接口中定义的方法如下:

 User selUserById(@Param("minId")Integer minId, @Param("maxId")Integer maxId);

UserMapper.xml文件中:


(3)也可以把传入的参数包装成一个map:

UserMapper.java接口中定义的方法:

User selUserById(Map map);

调用时的方法:

Map map = new HashMap();
map.put("minId',5);
map.put("maxId",12");
User selUserById(map);

UserMapper.xml文件中:


  1. 当接受的是JavaBean类型时,“#{}" 中可以通过 #{属性名} 来调用相对应的属性值:

	INSERT INTO User(id,name,age,password) VALUES(#{id},#{name},#{age},#{password})


关于${}

“$ { }” 符号,表示拼接SQL语句串,即把接收的参数内容不加任何修饰地拼接在SQL中,不使用“?”占位符(直接拼接,不需要占位)。"${}" 接受的参数类型可以是简单类型,普通JavaBean或者HashMap。

但是要注意的是,使用 “$ { }” 拼接符号拼接SQL语句,会引起SQL注入,所以一般不建议使用 “$ { }”。

  1. 当接受简单类型时,"${}" 中只能写"value",而不能是其他的名称!!!
    这与"#{}"要区别开来,下面是一个模糊查询的例子:

  1. 当接受JavaBean类型时,它会通过OGNL读取对象中的属性值(这点与"#{}"是一样的):

	INSERT INTO User(id,name,age,password) VALUES(${id},${name},${age},${password})

接受HashMap类型略。。。


总结

  1. "#{}"在SQL配置文件中,输入参数需要用占位符来标识对应的位置;
  2. “$ { }“在SQL配置文件中代表一个“拼接符号”,可以在原有SQL语句上拼接新的符合SQL语法的语句,一般用来模糊查询,平时应该尽量避免使用”$ { }”,因为它容易引起SQL注入。

你可能感兴趣的:(mybatis)