demo
一、数组形式的参数
优点: 针对简单sql,可以节约部分内存空间。减少代码量、易读。
缺点:
1、相同的参数不可以复用,让array占用更多的空间。(当然,以现在的硬件来说,这点空间/内存、多余添加数组值花费的时间 完全微不足道)
2、如果是in的参数,要动态拼接(?)占位符。(个人认为最麻烦、繁琐的,扩展:oracle对in最大支持1000)
3、如果sql中参数过多,其实不好阅读修改。
个人习惯用List添加参数,然后再把List转换成Array。
好处是:如果用数组,当sql存在动态条件,那么无法确定数组长度。而用List就不需要自己去维护。
二、map形式的参数
优点:
1、解决了in参数的问题。
2、参数值可以复用。
可以看出对in的参数形式支持很友好,查询条件也可以复用。但我遇到一个问题是:参数是in,在map不能用数组形式,用List是可以的。
特别:NamedParameterJdbcTemplate与jdbcTemplate没有任何的继承/实现关系(Named可以通过DataSource、JdbcTemplate来生成)。所以再写公共的父类dao时,要想一下怎么写。
三、javaBean形式的参数
简单浏览了下源码,感觉就是利用反射找到属性名。然后处理和map形式的一样。
此形式相对map来说,只在于是用Map还是JavaBean。
表面上的区别就是:如果参数是通过JavaBean传到dao层,那么不用把bean转换成map。相对的如果是通过map传到dao层的,也用map形式也无需转换成javaBean。
四、什么是防止sql注入?(个人很简单的理解)
假设sql: select * from child c where c.id = ? ;
如果在dao层为了贪图方便,或者没有防止sql注入的概念(就是安全性问题)。在dao层的代码:
String sql = "select * from child c where c.id='"+id+"'";
假设期望的id都是1,2,3等自增的数字字符串。
但是,此sql最后可能是任何形式。比如恶意攻击时,最终sql: select * from child c where c.id='100';delete from child; --'
红色下划线部分就是id的值(--在sql