1. 程式人生 > ><MyBatis>入門四 傳入的參數處理

<MyBatis>入門四 傳入的參數處理

string 問題 解決 ati ash 特殊 spa per transfer

1.單個參數

  傳入單個參數時,mapper文件中 #{}裏可以寫任意值

    /**
     * 傳入單個參數
     */
    Employee getEmpById(Integer id);
    <!--單個參數 #{} 裏可以寫任意值-->
    <select id="getEmpById" resultType="org.maple.pojo.Employee">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE id = #{abc}
    
</select>

2.多個參數

    /**
     * 傳入多個參數
     */
    Employee getEmpByIdAndName(Integer id,String name);
    <select id="getEmpByIdAndName" resultType="org.maple.pojo.Employee">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE id = #{id}
          AND last_name = #{name}
    
</select>

  此時會報錯 Caused by: org.apache.ibatis.binding.BindingException:Parameter ‘id‘ not found. Available parameters are [arg1, arg0, param1, param2]

  傳入多個參數時,mybatis會做特殊處理,

  將多個參數封裝成一個map,key是param1...paramN#{},從map中獲取指定的key值

解決辦法

  1、使用param1..paramN,

    <select id="getEmpByIdAndName"
resultType="org.maple.pojo.Employee"> SELECT id,last_name name,email,gender FROM tbl_employee WHERE id = #{param1} AND last_name = #{param2} </select>

  2.使用方法1,並不能見名知意,所以推薦第二種方法

    命名參數,明確指定封裝參數的map,

        key:使用@Param註解指定的值

        這樣就可以通過#{}來取值

    /**
     * 傳入多個參數
     */
    Employee getEmpByIdAndGender(@Param("id") Integer id, @Param("gender") Character gender);
    <select id="getEmpByIdAndGender" resultType="org.maple.pojo.Employee">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE id = #{id}
          AND gender = ${gender}
    </select>

3 .傳入pojo

  如果多個參數正好是我們業務邏輯的數據模型,直接傳入POJO,#{屬性名}:取出POJO屬性值

    /**
     * 傳入pojo
     */
    Employee getEmpByIdAndNamePojo(Employee employee);
    <!--傳入pojo對象-->
    <select id="getEmpByIdAndNamePojo" resultType="org.maple.pojo.Employee">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE id = #{id}
          AND last_name = #{name}
    </select>

4.傳入Map

  如果多個參數不是業務模型中的數據,沒有對應的POJO,不經常使用,為了方便,我們傳入map

    /**
     * 傳入map
     */
    Employee getEmpByMap(Map<String,Object> map);
    <!--傳入map-->
    <select id="getEmpByMap" resultType="org.maple.pojo.Employee">
        SELECT id,last_name name,email,gender
        FROM tbl_employee
        WHERE id = #{id}
          AND last_name = #{name}
    </select>
          Map<String, Object> map = new HashMap<>();
            map.put("id",1);
            map.put("name","tom");
            Employee emp = mapper.getEmpByMap(map);

5.傳入TO(transfer Object)

  多個參數不是業務中的模型,但是要經常使用,推薦寫一個TO,數據傳輸對象。

6.思考

  技術分享圖片

7.${},#{}區別

  #{}:是以預編譯的形式,將參數設置到sql語句中,PreparedStatement;防止sql註入

  ${}:取出的值直接拼裝在sql語句中;會有安全問題

  大多情況下,取參數使用#{}

  比如分表,select * from ${year}_salary where xxx;

  原生不支持占位符的:select * from tbl_employee order by ${name} ${order}

8.#{}的用法

  技術分享圖片

<MyBatis>入門四 傳入的參數處理