PreparedStatement
Statement 的⼦类,提供了 SQL 占位符的功能
使⽤ Statement 进⾏开发有两个问题:
1、需要频繁拼接 String 字符串,出错率较⾼。
2、存在 SQL 注⼊的⻛险。
SQL 注⼊:利⽤某些系统没有对⽤户输⼊的信息进⾏充分检测,在⽤户输⼊的数据中注⼊⾮法的 SQL语句,从⽽利⽤系统的 SQL 引擎完成恶意⾏为的做法
String pword="124 'or '1=1";
String sql="Select *from user where name='"+username+" 'and password='"+pword+"'";
显示
Select *from user wherename='肖战 'and password='124 'or '1=1' 此时密码无论如何都可以进去
用法
1.sql语句不同
String sql = "select * from t_user where username = ? and password = ?";
2.在创建prepareStatement时就将sql语句传入 PreparedStatement preparedStatement = connection.prepareStatement(sql);
3.问号的赋值 preparedStatement.setString(1,username); preparedStatement.setString(2,mypassword); ResultSet resultSet = preparedStatement.executeQuery(); if(resultSet.next()){ System.out.println("登录成功"); }else{ System.out.println("登录失败"); }
错误
String sql = "Insert into user('name','password') values(?,?)";
正确
String sql = "Insert into user(name,password) values(?,?)";
当JDBC里面的getConnection为静态方法时可以不声明,直接调
connection = JDBCTools.getConnection();
多态
定义方法时用父类,传参用子类
表单传参
<form action="/user" method="post"> ID: <input type="text" value="${user.id}" readonly><br/> 用户名:<input type="text" name="name" value="${user.name}"><br/> 密码:<input type="text" name="password" value="${user.password}"><br/> <input type="hidden" name="method" value="update">//类似于<a href="&method=update"> <input type="submit" value="提交"> </form>