Preparedstatement :执行sql的对象
1. SQL注入问题
用户随便输入密码:a' or 'a' = 'a
String sql = "select * from user where username = '"+username+"' and password = '"+password+"'"; System.out.println(sql);
拼接后的sql:select * from user where username = 'dafsdfda' and password = 'a' or 'a' = 'a'
请输入username: fassag 请输入password a' or 'a' = 'a Success!!!!!!
解决方案
通过Preparedstatement :执行sql
它是预编译的SQL( 一次编译、多次运行,省去了解析优化等过程,此外预编译语句能防止sql注入 。)
参数使用?作为占位符
全部的流程为:
步骠: 1.导入驱动jar包mysql-connector-java-5.1.37-bin.jar
2.注册驱动
3.获取数据库连接对象connection
4.定义sql 注意:sql的参数使用?作为占位符。如: select * from user where username ? and password ?;
5.获取执行sql语句的对象preparedstatement Connection.preparestatement(string sql) 6.给?赋值: *方法: setXXX(参数1,参数2) 参数1:?的位置编号 从1开始
参数2:?的值
7、执行sql,接受返回结果,不需要传递sql语句
8.处理结果
9.释放资源
小实例:
package cn.caq.jdbc; import cn.caq.utils.JDBCutils; import java.sql.*; import java.util.Scanner; /** * 需求: * 1.通过键盘录入用户名和密码 * 2.判断用户是否登录成功 */ public class JDBCDemo09 { public static void main(String[]args){ //1.键盘录入,接受用户名和密码 Scanner scanner = new Scanner(System.in); System.out.println("请输入username:"); String username = scanner.nextLine(); System.out.println("请输入password"); String password = scanner.nextLine(); //2.调用方法 // JDBCDemo08 jdbcDemo08 = new JDBCDemo08(); // boolean login = jdbcDemo08.login(username, password); boolean flag = new JDBCDemo09().login2(username, password); //3.判断结果,输出不同语句 if (flag){ System.out.println("Success!!!!!!"); }else { System.out.println("username or passwd False!!!!!!!!"); } } //登录方法 public boolean login2(String username,String password){ if (username == null || password == null){ return false; } Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; //1.连接数据库 try { conn = JDBCutils.getConnection(); //2.定义sql String sql = "select * from user where username = ? and password = ?"; //3.获取执行sql的对象 pstmt = conn.prepareStatement(sql); //给?赋值 pstmt.setString(1,username); pstmt.setString(2,password); //4.执行sql语句 rs = pstmt.executeQuery(); //5.判断 return rs.next();//有下一行返回true } catch (SQLException throwables) { throwables.printStackTrace(); } finally { JDBCutils.close(rs,pstmt,conn); } return false;//如果出现异常返回false } }
SQL注入一般是通过利用SQL语句的规则使条件成立 它是
预编译的SQL( 一次编译、多次运行,省去了解析优化等过程,此外预编译语句能防止sql注入 。)
参数使用?作为占位符
能够解决简单的SQL注入的问题!!!