Mybatis参数传递及返回类型
mybatis參數(shù)傳遞:
?? ?單個參數(shù):不做特殊處理
?? ??? ?#{參數(shù)名}:取出參數(shù)值
?? ?多個參數(shù):做特殊處理
?? ??? ?多個參數(shù)會被封裝成一個map
?? ??? ??? ?key:param1?? ...?? paramN
?? ??? ??? ?value:傳入的參數(shù)值
?? ??? ?#{}就是從map中獲取指定的key值
?? ??? ?
?? ??? ?操作:
?? ??? ??? ?方法:public Employee getEmployeeByNmaeAndPass(String name,String pass);
?? ??? ??? ?取值:#{name},#{pass}
?? ?命名參數(shù):明確指定封裝參數(shù)時map的key:@Param("id")
?? ??? ?多個參數(shù)會被封裝成一個map
?? ??? ??? ?key:使用@Param注解指定的值
?? ??? ??? ?value:參數(shù)值
?? ??? ??? ?#{指定的key}取出對應(yīng)的參數(shù)值
?? ?POJO:
?? ?如果多個參數(shù)是業(yè)務(wù)模型中的數(shù)據(jù),可以直接使用POJO:
?? ??? ??? ?#{屬性名}:取出傳入的POJO 的屬性值
?? ?Map:
?? ?如果多個參數(shù)不是業(yè)務(wù)模型中的數(shù)據(jù),沒有對應(yīng)的POJO,為了方便,可以傳入map
?? ??? ??? ?#{key}:取出map中對應(yīng)的值
?? ?
?? ?TO:
?? ?如果多個參數(shù)不是業(yè)務(wù)模型中的數(shù)據(jù),但是經(jīng)常要是用,推薦來編寫一個TO(Transfer Object)數(shù)據(jù)傳輸對象
?? ?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)類型或者是數(shù)組型,也會特殊處理,
?? ?也是把傳入的list或者數(shù)組封裝在map中
?? ??? ?key:Collection(collection),如果是List還可以使用這個key(list)
?? ??? ????? 數(shù)組(array)
?? ?public Employee getEmpById(List<Integer> ids);
?? ?取值:取出第一個id的值:#{list[0]}
mybatis處理參數(shù):
總結(jié):參數(shù)多時會封裝map,未了不混亂,可以使用@Param來指定封裝時使用的key;
#{key}就可以取出map中的值
(@Param("id")Integer id,@Param("name")String name);
ParamNameResolver解析參數(shù)封裝的map:
?? ?names:{0=id,1=name}
?? ?1、獲取每個標(biāo)了param注解的參數(shù)的@Param的值:id,name:賦值給name
?? ?2、每次解析一個參數(shù)給map中保存信息:(key:參數(shù)索引,value:name的值)
?? ??? ?name的值:
?? ??? ??? ?標(biāo)注了param注解:注解值
?? ??? ??? ?沒有標(biāo)注:
?? ??? ??? ?1、全局配置:userActualParam(jdk1.8):name=參數(shù)名
?? ??? ??? ?2、name=map.size();相當(dāng)于當(dāng)前元素索引
mybatis參數(shù)值的獲取
#{}:可以獲取map中的值或者pojo對象屬性的值
${}: 可以獲取map中的值或者pojo對象屬性的值
區(qū)別:
?? ?#{}:是以預(yù)編譯的形式,將參數(shù)設(shè)置到sql語句中:PreparedStatement;防止sql注入
?? ?${}:取出的值,直接拼接在sql語句中,會由安全問題;
?? ?大多情況下,都會使用#{}
?? ?當(dāng)存在分表、排序:按照年份分表拆分
?? ??? ?原生jdbc不支持占位符的地方就可以使用${}進(jìn)行取值
?? ??? ?select * from? ${year}_salary where xxxx;
?? ??? ?select * from tb_student order by ${name}
?? ??? ?
#{}:
?? ?可以規(guī)定參數(shù)的一些規(guī)則:
?? ?JavaType、jdbcType、mode(存儲過程)、numeriScale、resultMap、typeHandler、jdbcTypeName
?? ?jdbcType通常需要在某種特定的條件下唄被設(shè)置:
?? ??? ?在數(shù)據(jù)為null的時候,有些數(shù)據(jù)庫可能不能識別mybatis對null的默認(rèn)處理。
?? ??? ?比如:Oracle(報(bào)錯)
?? ??? ?insert into student(id,name,age) values(null,'test',null)
?? ??? ?oracle不能識別對null的操作,報(bào)錯。因?yàn)閙ybatis對所有的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數(shù)據(jù)庫時的影響。
返回參數(shù)類型:
List型:
?? ?resultType:返回的是一個集合,要寫集合中元素的類型
Map型:
?? ?resultType=“map”:返回一條記錄
?? ?key:就是列名??? value:對應(yīng)的值
?? ?mybatis對用到的部分類進(jìn)行了封裝,可直接使用封裝類型。
?? ?返回多條記錄封裝一個map:
?? ?1、resultType:要寫集合中元素的類型。
?? ??? ?Map<Integer,Employee>:
?? ??? ??? ??? ?鍵是這條記錄的主鍵,值是記錄封裝后的JavaBean
?? ?2、在對應(yīng)的方法上添加@MapKey("id") 告訴mybatis封裝這個map的時候使用哪個屬性作為map的key
???
轉(zhuǎn)載于:https://www.cnblogs.com/staticking/p/7001091.html
總結(jié)
以上是生活随笔為你收集整理的Mybatis参数传递及返回类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python——成语接龙小游戏
- 下一篇: width:100vh与min-heig