Mybatis参数获取与传递
一般建议使用#{},而在特定情况下才使用${},比如:模糊查询like以及批量删除的时候
Mybatis的参数传递主要有6种方式:
- 单个参数
- 多个参数
- 命名参数@Param
- Pojo
- Map
- Collection、Array【一般用于动态SQL】
1、${}
//在该方式中,mybatis调用的是Statement对象、调用的executeUpdate("SQL")的方法
<insert>
insert into user values (null ,${name},${age},${sex})
<insert/>
//实际上底层形成的SQL是 insert into user values (null,zhangsan,23,男)
/**
但是我们需要的是
insert into user values (null,'zhangsan',23,'男')
所有我们需要将 ${} 改成 '${}',''需要我们手动拼接上
*/
2、#{}
//在该方式中,mybatis调用的是PreparedStatement对象、调用的executeUpdate()的方法
<insert>
insert into user values (null ,#{name},#{age},#{sex})
<insert/>
//实际上底层形成的SQL是 insert into user values (null,?,?,?)
//mybatis底层默认会自动加上''
3、总结
一)当传输参数为单个String类型或基本数据类型及其包装类时
#{}:可以使用任意名字获取参数值,因为预编译的参数接收只与参数位置1、2、3有关
: 只 能 用 {}:只能用 :只能用{value}、${_parameter}来获取参数值
二) 当传输参数为一个Java Bean时
#{}和${}都可以通过属性名直接获取属性的参数值
三)当传输的参数为2个及以上时
mybatis会默认将参数放在map集合中:
1.键为arg0 \arg1 \arg2…
2.键为param1 \ param2…
3.以参数为value
#{}:可以使用 #{arg0} #{arg1} | #{param1} #{param2}
: 可 以 用 {}: 可以用 :可以用{atg0} ${arg1} | ${param1} ${param2},同时应注意’'的问题
四)当传输参数为Map类型时
Map<String ,Object> map = new HashMap<String ,Object>();
map.put("id",1001);
map.put("name","shufang");
Employee employee = mapper.getEmpByMap(map);
#{}${}都可以使用指定的key进行参数的指定 ~,但是需要注意**$$$$$的 ‘’ 问题**
五)通过@Param注解指定参数的key
//通过@Param注解来指定参数放进map的key
Employee getEmpByIdAndNameParam(@Param("id")String id, @Param("name") String name);
六)当传递的参数为List或者Array,mybatis会将List与Array参数放进Map中
List以list为key
Array以array为key
4、BindingException
Cause: org.apache.ibatis.binding.BindingException: Parameter ‘id’ not found
这种异常就是#{}或者${}获取参数值有问题产生的异常
5、通过@Param指定K
通过@Param指定参数存在map中的key
//通过@Param注解来指定参数放进map的key
Employee getEmpByIdAndNameParam(@Param("id")String id, @Param("name") String name);
<!--Employee getEmpByIdAndNameParam(@Param("id")String id, @Param("name") String name);-->
<select id="getEmpByIdAndNameParam" resultType="Employee">
select * from hr_emp where empid = #{id} and name = #{name}
</select>