参数问题解决
1.当Mapper方法中的参数只有一个参数时,
1.1当参数是个普通对象时,例如EmployeeMapper接口中的一个方法为public Employee selectEmp(Integer id);
,我们在映射文件EmployeeMapper.xml上要配置
<select id="selectEmp" resultType="com.neuedu.entity.Employee">
select id,e_name,gender,email from employee where id = #{id}
select>
#{id}是用来传递参数,因为就一个参数,所以Mapper方法的参数只能放在这,#{id}可以是任意的,如#{iid},都可以正常执行。
1.2当参数是一个自己创建的实体类的对象时,例如EmployeeMapper接口中的一个方法为public void insertEmp(Employee employee);
我们在映射文件EmployeeMapper.xml上要配置:
insert into employee(e_name,gender,email) values(#{name},#{gender},#{email})
#{}中要与实体类的属性名一致。
2.当参数为多个时,例如EmployeeMapper接口中的一个方法为
public void updateEmpNameById(@Param("name")String name,@Param("email")String email,@Param("id")int id);
在映射文件EmployeeMapper.xml中配置:
update employee set e_name=#{name},email=#{email} where id=#{id}
Mapper方法中要加@Param注解,或者在映射文件中写#{param1},#{param2},#{param3} 或者写0,1,2
update employee set e_name=#{param1},email=#{param2} where id=#{param3}
update employee set e_name=#{0},email=#{1} where id=#{2}
3.当传入的参数是一个Map类型时,例如:
public void updateEmpName(Map<String, Object> map);
在映射文件EmployeeMapper.xml配置:
<sql id="employeeSQL">
update employee set name=#{name},email=#{email} where id=#{id}
sql>
<update id="updateEmpName">
<include refid="employeeSQL"/>
update>
注意:其中用到了SQL节点,把常用的SQL语句提取出来,以后SQL语句中如果有常用的SQL语句,就可包含导入。
测试一下能否使用:
@Test
public void testupdateEmpName(){
Map<String, Object> map=new HashMap<>();
map.put("name", "xiaogougou");
map.put("email", "[email protected]");
map.put("id", 5);
mapper.updateEmpName(map);
session.commit();
session.close();
}
4.参数获取的方法#{}与${}的区别
#{}:可以获取map中的值或者pojo对象属性的值
${}: 可以获取map中的值获取pojo对象属性的值
区别:
#{}:是以预编译的形式,将参数设置到sql语句中,PreparedStatement;防止sql注入
${}:取出的值直接拼装在sql语句中,会有安全问题;
原生JDBC不支持占位符的地方我们就可以使用${}进行取值,#{}只是取出参数中的值!
例子:
update ${param4} set e_name='${param1}',email=#{param2} where id=${param3}
编译以后,SQL语句为update employee set e_name='gouge',email=? where id=4
当操作的表名当做参数传入SQL语句时,要是用${}传入。
update ${param4} set e_name='${param1}',email=#{param2} where id=#{param3}
注意:当${}在一定的地方要加双引号(”“)。
关于参数的问题:
①.使用#{}来传递参数
②.若目标方法的参数类型为对象类型,则调用其对应的getter方法,如getEmail()
③.若目标方法的参数类型为Map类型,则调用其get(key)
④.若参数是单个的,或者列表,需要使用@param注解来进行标记
⑤.注意:若只有一个参数,则可以省略@param注解