#{}和${}的区别 类似于 PreparedStatement和Statement的区别。
#{}和PreparedStatement,会预编译sql语句,然后通过展符的方式进行赋值,并能够把java的数据类型转为jdbc类型,如java字符串“1”,会转为‘1’,java int类型1,会转为jdbc的int类型1,并且能够对特殊字符进行转义
${}和Statement会直接拼接sql,不会进行处理,如sql语句String sql = "select * from table where column = ",拼接输入的值String column = “1001”后 sql += column,最终在数据执行的sql是select * from table where column = 1001(报错,因为没有1001会被当作列名处理,而不是字段值)。如通过占位符的方式,最终执行的sql将是select * from table where column = ‘1001’。
若想让拼接的sql能正常只执行,必须手动加入’‘。如String sql = "select * from table where column=’ "; String cloumn = “1001”; sql += column; sql += " ’ ";。拼接后最终执行的sql:select * from table where column=‘1001’。
sql注入。对于输入值String column = " ’or 1=1 or ’ ";通过预编译的方式,最终在数据库中执行的sql:select * from table where column = '\ ’ or 1=1 or\ ’ ',会进行转义。若通过字符串拼接的方式,最终执行的sql:select * from table where ‘’ or 1=1 or ‘’,出现sql注入问题
#{}
// #{}, PreparedStatement测试
String sql = "SELECT * FROM student_t WHERE STU_NAME=?";
try{
// connection数据库连接创建过程省略。
PreparedStatement preparedStatement = connection.preparedStatement(sql);
// 与编译后的SQL:SELECT * FROM student_t WHERE STU_NAME=** NOT SPECIFIED **。执行时不再编译sql语句
// 占位符赋值,
// 测试1
preparedStatement.setObject(1,"test");
// 赋值后SQL:SELECT * FROM student_t WHERE STU_NAME='test'。
// 会进行java与JDBC数据类型转换,java字符串类型“test”转为jadbc类型'test'
// 测试2
// preparedStatement.setObject(1,"test");
// preparedStatement.setObject(1,1001);
// 赋值后SQL:SELECT * FROM student_t WHERE STU_NAME=1001。
// 会进行java与JDBC数据类型转换,java int类型1001转为jdbc的int类型1001
}
- ${}
// ${} Statement测试
String sql = "SELECT * FROM student_t WHERE STU_NAME=";
try{
// 创建数据库语句声明
Statement statement = connection.createStatement();
// 测试1
// sql += "test"
// statement.executeQuery(sql);
// SQL语句:SELECT * FROM student_t WHERE STU_NAME=test
// JDBC不会把test当作字符串处理,会直接在数据库中执行上面sql语句,test会被当作数据库字段处理
// 测试2
// sql += " ' ";
// sql += "test"; // ' 不能在这加,用户输入的值是test,不是'test'。
// sql += " ' ";
// statement.executeQuery(sql);
// sql语句:SELECT * FROM student_t WHERE STU_NAME='test';
// 语句正常执行
// 测试3 sql注入
// sql += " ' ";
// sql +=" 'or 1=1 or ' ";
// sql += " ' ";
// statement.executeQuery(sql);
// sql语句:SELECT * FROM student_t WHERE STU_NAME='' or 1=1 or'';
}