1.oracle数据库使用PLSQL软件时,自己加入数据后需要commit,数据才会执行insert语句。
2.SQL注入
sql注入的原因,表面上说是因为 拼接字符串,构成sql语句,没有使用 sql语句预编译,绑定变量。
但是更深层次的原因是,将用户输入的字符串,当成了 “sql语句” 来执行。
比如String queryString = "from User t where t.username= " + usernameString + " and t.password="+passwordString;
我们希望用户输入的 username和password 的值,仅仅作为一个字符串字面值,传入数据库执行。
但是当password输入了:123 or 1=1 时,其中的 or 1=1 并没有作为 where id= 的字面值,而是作为了 sql语句 来执行的。所以其本质是将用户的输入的数据,作为了命令来执行。
解决办法:sql语句预编译和绑定变量,是防御sql注入的最佳方法。为了防止SQL注入,避免使用拼凑SQL语句的方式!!
使用hibernate或mybatis时,一般默认会进行预编译。
对mybatis来说, #{name}形式的,那么就是sql预编译,使用 ${name} 就不是sql预编译的
参数绑定有2种办法:使用positional parameter(查询字符串中使用?)或者named parameter(查询字符串中使用:)。
例如:
//hql语句
String queryString = "from User t where t.username :usernameString and t.password : passwordString";
//执行查询
List result = session.createQuery(queryString)
.setString("usernameString ", usernameString )
.setString("passwordString", passwordString)
.list();