首先介绍一下:
一. 使用映射方式时,传入Map,map里放了几个字段,还有一个list
这时使用foreach时,
注意:
1、首先 传入的集合,collection后的命名和 Map里塞list时的
key保持一致
2、list是集合,不能进行 != "" 的校验,因为它不是String,类型不同
3、如果Map里的list里放的是字符串,则 #{ groupCode} 里放的就是 和Item命名一致
4、如果Map里的list里放的是map,则 #{ groupCode} 里放的就是 Item命名.key
这个key和list里放的map的key保持一致
讲完入参,将返回值
如果要返回 List<Map<String,Object>> ,
写 resultType = "java.util.Map" 或者 resultMap = "resultMap"
特别说明:resultMap里和实体类相互对应,如果写resultMap,则返回的map里字段必须是对应关系里有的,且字段名一致
另外,之所以有resultMap ,也是因为mybatis封装在这个可以把返回的map转换为对应的实体类对象,
所以,如果不写List<Map<String,Object>>接收返回的list,也可以使用List<实体类名>来接收
二:传的如果是实体类对象,则 paramterType="对象实体类的引用"
三:sql中 # 和 $ 的区别: #可以防止sql注入
#
是占位符,在DBMS才进行替换,在预编译时使用?
占位,能防止sql注入;
delete from user where name = ?;
而传入的参数将会经过PreparedStatement方法的强制类型检查和安全检查等处理,最后作为一个合法的字符串传入。
在#{}预处理之后可以预防SQL注入传入username 为 xiaoming‘or’1=1,使用#{},经过sql动态解析和预编译,会把单引号转义为 ’ 那么sql最终解析为:
delete from user where name = "xiaoming\' or \'1=1 ";
$
是拼接符,在动态sql解析阶段将会进行变量替换,有可能会引发sql注入
${}这种方式只是简单的字符串替换,在动态SQL解析阶段将会进行变量替换,假如传递的参数为xiaoming,
最终处理结果如下:
delete from user where name = 'xiaoming' ;
预编译之前就已经被替换,有被注入的风险。如果传入的为那么使用{} 处理后直接替换字符串的sql就解析为:
delete from user where name = 'a' or '1=1' ;
这样整个表的数据就会被干掉引发生产事故