<MyBatis>入門四 傳入的參數處理
阿新 • • 發佈:2018-12-13
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>入門四 傳入的參數處理