本文主要是介绍mybatis开发dao层时给sql传参与接收返回值注意点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先介绍一下:
一. 使用映射方式时,传入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' ;
这样整个表的数据就会被干掉引发生产事故
这篇关于mybatis开发dao层时给sql传参与接收返回值注意点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!