欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-18 15:30:51
...

参数问题解决

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", "[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注解