结合源码,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不能正确处理;


浙公网安备 33010602011771号