String sql = "select * from table where id = ";
String id = "123";
sql += id; // 拼接方式
execute(sql);
拼接方式如果 id 被(恶意)改成 id = "123 or 1=1" 则最终查询结果会完全不一样。
String sql = "select * from table where id = :id";
而占位符的方式将语句与用户数据分开的。即使错写成 id = "123 or 1=1" 也会把
这个整体当作用户数据,而不会把 or 1=1 当成是查询语句。
"select * from table where id = \'123 or 1=1\'"
可以这样理解用占位符后的实际执行语句(但实际上并不是简单地增加了单引号
具体参考:http://blog.csdn.net/inconsolabl/article/details/48091903)