MyBatis框架中Mapper方法中的参数问题解决方案

来源:互联网 发布:朝鲜族和韩国人知乎 编辑:程序博客网 时间:2024/05/21 04:20

参数问题解决

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 id="insertEmp" parameterType="com.neuedu.entity.Employee" >        insert into employee(e_name,gender,email) values(#{name},#{gender},#{email})</insert>

#{}中要与实体类的属性名一致。

2.当参数为多个时,例如EmployeeMapper接口中的一个方法为

public void updateEmpNameById(@Param("name")String name,@Param("email")String email,@Param("id")int id);

在映射文件EmployeeMapper.xml中配置:

<update id="updateEmpNameById">            update employee set e_name=#{name},email=#{email} where id=#{id}        </update>

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", "xiaogou@163.com");        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注解

原创粉丝点击