Statement和PreparedStatement的区别
SQL注入
在了解这两个关键字的用法之前我们还是要了解SQL注入
什么是SQL注入?
通过一个例子来说:假如我们的一个登录系统,在我们数据库中有一个账户号为:tao,账户密码为:123456。
我们登录系统的时候我们只知道账户号为tao,不知道密码的情况下怎么使用SQL注入的方式登录进去呢?
在我们的登录界面的账户栏输入我们的账户:tao
在密码的输入框中输入一段恒成立的字符串:如:‘1’ or '1'='1';
就这个直接登录进我们的一个系统
前提条件:我们的后台的代码判断账户号和密码密码是通过数据库判断的,而不是通过用户名在数据库中查出密码在JAVA代码中和输入的密码进行比较。
String str = "select * from a_account where username = %s and password = %s";
Statement连接数据库的写法:
Class.forName("oracle.jdbc.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "tao","root");
//以前SQL的写法
/*
Statement statement = connection.createStatement();
//%s:转义符表示字符串格式
//不建议后面跟 and password='':这样的话就是纯数据库操作了,用的不好的话可能会被别人攻击,一般我们通过数据库把用户查出来后用java代码去比较,因为用户名的密码我们以后肯定是要加密的
String str = "select * from a_account where username = '%s'";
String sql = String.format(str, inputUsername);//传值,将inputUsername传给sql语句str中的%s;
ResultSet resultSet = statement.executeQuery(sql);
PreparedStatement连接数据库的写法:
将原来表示字符串的%s用?替换了
Class.forName("oracle.jdbc.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "tao","root");
String str = "select * from a_account where username = ? and password = ?";
PreparedStatement preparedStatement=connection.prepareStatement(str);
preparedStatement.setString(1,inputUsername);
preparedStatement.setString(2,inputpassword);
ResultSet resultSet=preparedStatement.executeQuery();
PreparedStatement继承了Statement,用于防止SQL的注入,接受一个或多个动态输入参数