zoukankan      html  css  js  c++  java
  • MyBatis框架中Mapper方法中的参数问题解决方案

    参数问题解决

    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注解

  • 相关阅读:
    1025WHERE执行顺序以及MySQL查询优化器
    1025基础REDIS
    1025关于explain的补充1
    1021mysql 全外连接
    python开发进程:进程开启方式&多进程
    python开发面向对象进阶:反射&内置函数
    python开发socket套接字:粘包问题&udp套接字&socketserver
    python开发面向对象基础:封装
    python开发模块基础:异常处理&hashlib&logging&configparser
    python开发面向对象基础:接口类&抽象类&多态&钻石继承
  • 原文地址:https://www.cnblogs.com/mazhitao/p/7487952.html
Copyright © 2011-2022 走看看