小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
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注入的问题!!!