mybatis參數傳遞:
?? ?單個參數:不做特殊處理
?? ??? ?#{參數名}:取出參數值
?? ?多個參數:做特殊處理
?? ??? ?多個參數會被封裝成一個map
?? ??? ??? ?key:param1?? ...?? paramN
?? ??? ??? ?value:傳入的參數值
?? ??? ?#{}就是從map中獲取指定的key值
?? ??? ?
?? ??? ?操作:
?? ??? ??? ?方法:public Employee getEmployeeByNmaeAndPass(String name,String pass);
?? ??? ??? ?取值:#{name},#{pass}
?? ?命名參數:明確指定封裝參數時map的key:@Param("id")
?? ??? ?多個參數會被封裝成一個map
?? ??? ??? ?key:使用@Param注解指定的值
?? ??? ??? ?value:參數值
?? ??? ??? ?#{指定的key}取出對應的參數值
?? ?POJO:
?? ?如果多個參數是業務模型中的數據,可以直接使用POJO:
?? ??? ??? ?#{屬性名}:取出傳入的POJO 的屬性值
?? ?Map:
?? ?如果多個參數不是業務模型中的數據,沒有對應的POJO,為了方便,可以傳入map
?? ??? ??? ?#{key}:取出map中對應的值
?? ?
?? ?TO:
?? ?如果多個參數不是業務模型中的數據,但是經常要是用,推薦來編寫一個TO(Transfer Object)數據傳輸對象
?? ?Page{
?? ??? ?int index;
?? ??? ?int size;
?? ?}
示例:
1、public Employee getEmployee(@Param("name")String name,String pass);
?? ?取值:name=====>#{name/param1}?? pass=====>#{param2}
2、public Employee getEmployee(String name,@Param("emp")Employee employee);
?? ?取值:name====>#{param1}????? pass=====>#{emp.pass/param2.pass}
3、如果是Collection(List?? Set)類型或者是數組型,也會特殊處理,
?? ?也是把傳入的list或者數組封裝在map中
?? ??? ?key:Collection(collection),如果是List還可以使用這個key(list)
?? ??? ????? 數組(array)
?? ?public Employee getEmpById(List<Integer> ids);
?? ?取值:取出第一個id的值:#{list[0]}
mybatis處理參數:
總結:參數多時會封裝map,未了不混亂,可以使用@Param來指定封裝時使用的key;
#{key}就可以取出map中的值
(@Param("id")Integer id,@Param("name")String name);
ParamNameResolver解析參數封裝的map:
?? ?names:{0=id,1=name}
?? ?1、獲取每個標了param注解的參數的@Param的值:id,name:賦值給name
?? ?2、每次解析一個參數給map中保存信息:(key:參數索引,value:name的值)
?? ??? ?name的值:
?? ??? ??? ?標注了param注解:注解值
?? ??? ??? ?沒有標注:
?? ??? ??? ?1、全局配置:userActualParam(jdk1.8):name=參數名
?? ??? ??? ?2、name=map.size();相當于當前元素索引
mybatis參數值的獲取
#{}:可以獲取map中的值或者pojo對象屬性的值
${}: 可以獲取map中的值或者pojo對象屬性的值
區別:
?? ?#{}:是以預編譯的形式,將參數設置到sql語句中:PreparedStatement;防止sql注入
?? ?${}:取出的值,直接拼接在sql語句中,會由安全問題;
?? ?大多情況下,都會使用#{}
?? ?當存在分表、排序:按照年份分表拆分
?? ??? ?原生jdbc不支持占位符的地方就可以使用${}進行取值
?? ??? ?select * from? ${year}_salary where xxxx;
?? ??? ?select * from tb_student order by ${name}
?? ??? ?
#{}:
?? ?可以規定參數的一些規則:
?? ?JavaType、jdbcType、mode(存儲過程)、numeriScale、resultMap、typeHandler、jdbcTypeName
?? ?jdbcType通常需要在某種特定的條件下唄被設置:
?? ??? ?在數據為null的時候,有些數據庫可能不能識別mybatis對null的默認處理。
?? ??? ?比如:Oracle(報錯)
?? ??? ?insert into student(id,name,age) values(null,'test',null)
?? ??? ?oracle不能識別對null的操作,報錯。因為mybatis對所有的null都映射的是原生jdbc的other類型。
?? ??? ?但是MySQL可以識別對null的操作,若想解決此問題,則使用以下添加語句;
?? ??? ?
?? ??? ?1、insert into student(id,name,age) values(#{id},#{name},#{age,jdbcType=NULL})
?? ?
?? ??? ?2、由于全局配置中,jdbcTypeForNull=OTHER:oracle不支持
?? ??? ??? ?<setting name="jdbcTypeForNull" value="NULL">
?? ??? ??? ?此配置對使用MySQL數據庫時的影響。
返回參數類型:
List型:
?? ?resultType:返回的是一個集合,要寫集合中元素的類型
Map型:
?? ?resultType=“map”:返回一條記錄
?? ?key:就是列名??? value:對應的值
?? ?mybatis對用到的部分類進行了封裝,可直接使用封裝類型。
?? ?返回多條記錄封裝一個map:
?? ?1、resultType:要寫集合中元素的類型。
?? ??? ?Map<Integer,Employee>:
?? ??? ??? ??? ?鍵是這條記錄的主鍵,值是記錄封裝后的JavaBean
?? ?2、在對應的方法上添加@MapKey("id") 告訴mybatis封裝這個map的時候使用哪個屬性作為map的key
???
轉載于:https://www.cnblogs.com/staticking/p/7001091.html