SQL参数:向sql语句中传递的可变参数,分为预编译#{}和传值${}两种
ü 预编译 #{}:将传入的数据都当成一个字符串,会对自动传入的数据加一个单引号,能够很大程度防止sql注入;
ü
ü 传值${}:传入的数据直接显示生成在sql中,无法防止sql注入;适用场景:动态报表,表名、选取的列是动态的,order by和in操作, 可以考虑使用$

传值和预编译区别是 预编译偷偷的给你sql语句的传入的内容加上了两个单引号

建议:sql.xml 配置参数使用:#{},#param# 不要使用${} 此种方式容易出现 SQL 注入。见《Java开发手册1.5》之5.4.4;


ü JDBC上的预编译

| /预编译/Connection conn = null;
PreparedStatement stmt = null;String sql; sql = “SELECT * FROM t_user where userName= ? “;
stmt = conn.prepareStatement(sql); //传递进去的参数有个 ? 占位符 stmt.setString(1, “lison”);//这里是给参数传递进去代替 ?
System.out.println(stmt.toString());//打印sql
ResultSet rs = stmt.executeQuery(); | | —- |

| Connection conn = null;
Statement stmt = null;
stmt = conn.createStatement();
/参数是直接丢进去的,不是预编译/
String userName = “lison”;
String sql = “SELECT * FROM t_user where userName=’” + userName + “‘“;
ResultSet rs = stmt.executeQuery(sql);
System.out.println(stmt.toString()); | | —- |



参考:
https://www.cnblogs.com/grefr/p/5046352.html

1.Sql注入问题


假如 传的参数是 ‘xxx’ or 1=1

预编译就不会sql注入 ,因为传的参数通过预编译后 就在前后加了个单引号了.就成了一个字符串了,
如果是传值的话,就会有sql注入的问题,因为传值没有给参数前后加单引号,然后sql语句由于or 1 =1 就默认是true 了.