结合源码,mybatis怎么处理参数

总结:参数多时会封装map,为了不混乱,我们可以使用@Param指定封装时使用的key
#{key}就可以取出map中的值;

 1 public Object getNamedParams(Object[] args) {
 2     final int paramCount = names.size();
 3     //1、参数为null直接返回
 4     if (args == null || paramCount == 0) {
 5       return null;
 6      
 7     //2、如果只有一个元素,并且没有Param注解;args[0]:单个参数直接返回
 8     } else if (!hasParamAnnotation && paramCount == 1) {
 9       return args[names.firstKey()];
10       
11     //3、多个元素或者有Param标注
12     } else {
13       final Map<String, Object> param = new ParamMap<Object>();
14       int i = 0;
15       
16       //4、遍历names集合;{0=id, 1=lastName,2=2}
17       for (Map.Entry<Integer, String> entry : names.entrySet()) {
18       
19           //names集合的value作为key;  names集合的key又作为取值的参考args[0]:args【1,"Tom"】:
20           //eg:{id=args[0]:1,lastName=args[1]:Tom,2=args[2]}
21         param.put(entry.getValue(), args[entry.getKey()]);
22         
23         
24         // add generic param names (param1, param2, ...)param
25         //额外的将每一个参数也保存到map中,使用新的key:param1...paramN
26         //效果:有Param注解可以#{指定的key},或者#{param1}
27         final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);
28         // ensure not to overwrite parameter named with @Param
29         if (!names.containsValue(genericParamName)) {
30           param.put(genericParamName, args[entry.getKey()]);
31         }
32         i++;
33       }
34       return param;
35     }
36   }
37 }


参数值的获取

 

#{}:可以获取map中的值或者pojo对象属性的值;
${}:可以获取map中的值或者pojo对象属性的值;

 

select * from tbl_employee where id=${id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=2 and last_name=?

区别:
#{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement防止sql注入
${}:取出的值直接拼装在sql语句中;会有安全问题;
大多情况下,我们去参数的值都应该去使用#{};

原生jdbc不支持占位符的地方我们就可以使用${}进行取值
比如分表、排序。。。;按照年份分表拆分
select * from ${year}_salary where xxx;
select * from tbl_employee order by ${f_name}      ${order}



 

 

jdbcType通常需要在某种特定的条件下被设置:
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错)

JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型oracle不能正确处理;

posted @ 2020-05-17 23:39  小草dym  阅读(120)  评论(0)    收藏  举报