单个参数传递
可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis克直接使用这个惨数,不需要经过任何处理。
代码演示
UserDao接口代码:
/**
* 根据id查询用户信息
* @param id
* @return
*/
User queryForId(Integer id);
UserDaoMapper.xml代码:
<select id="queryForId" resultType="com.gz.mybatis01.User">
select * from user where id = #{id}
</select>
多个参数传递
两个以上参数,都会被MyBatis重新包装成一个Map传入。Map的key就是param1,param2…。 0,1…就是我们传入的参数。
代码演示
方式一
UserDao接口代码:
/**
* 根据id和name查询用户信息
* @param id
* @param name
* @return
*/
User queryForIdAndName(Integer id,String name);
UserDaoMapper.xml代码:
<select id="queryForIdAndName" resultType="com.gz.mybatis01.User">
select * from user where id = #{param1} and name = #{param2}
</select>
但是我们一般不是用这种方法,参数多的时候,不清楚传入的参数是什么。
方式二:我们在UserDao接口方法参数中使用@Param注解
UserDao接口代码:
/**
* 根据id和name查询用户信息
* @param id
* @param name
* @return
*/
User queryForIdAndName(@Param("id") Integer id, @Param("name") String name);
UserDaoMapper.xml代码:
<select id="queryForIdAndName" resultType="com.gz.mybatis01.User">
select * from user where id = #{id} and name = #{name}
</select>
方式三:自定义Map,传入参数。
UserDao接口代码:
/**
/**
* 根据id和name查询用户信息
* @param map
* @return
*/
User queryForIdAndName(Map map);
UserDaoMapper.xml代码:
<select id="queryForIdAndName" resultType="com.gz.mybatis01.User">
select * from user where id = #{id} and name = #{name}
</select>
调用方法类:
Map<String,Object> map = new HashMap<String, Object>();
map.put("id",1);
map.put("name","芒果");
User user = mapper.queryForIdAndName(map);
System.out.println(user);
#{}与${}
#{}:占位符,会Sql预编译,变量替换实在DBMS中,#{} 对应的变量自动加上单引号 ‘’, 能防止sql 注入。
S{}:拼接符,Sql拼接,变量替换实在DBMS外,${} 对应的变量不会加上单引号 ‘’,不能能防止sql 注入。
#{} 和 ${} 在使用中的技巧和建议:
- 能用 #{} 的地方就用 #{},不用或少用 ${}
- 表名作参数时,必须用 ${}。如:select * from ${tableName}
- order by 时,必须用 ${}。如:select * from t_user order by ${columnName}
- 使用 ${} 时,要注意何时加或不加单引号,即 ${} 和 ‘${}’