PreparedStatement的使用
什么是SQL注入?
- 即本来应该是值的位置,添加进去了SQL语句
例:——注入的内容:or ‘1’=’1’
如何处理?
- 使用PreparedStatement,将编译期改为预编译
- 好处:由于创建对象时已经将SQL语句逻辑部分编译完成,所以不会被用户的输入内容所影响
,从而解决SQL注入的问题
与statement相比的优势?
——编译时将SQL语句的逻辑锁死
好处:代码结构整洁,不易出错,可以避免SQL注入
什么时候使用?
当SQL语句中有变量时使用PreparedStatement,反之使用Statement
————————————————————————————————————————
package DBCP;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
import org.junit.Test;
public class 模拟登录 {
@Test
public void create() {
try(Connection connection = DBUtils.getConnection()){
Scanner scanner = new Scanner(System.in);
System.out.println("输入账号");
String username = scanner.nextLine();
System.out.println("输入密码");
String password = scanner.nextLine();
/*
Statement statement = connection.createStatement();
String sql = "select count(*) from jduser where username='"+username+"' and password='"+password+"' or '1'='1'";
ResultSet rs = statement.executeQuery(sql);
*/
String sql = "select count(*) from jduser where username=? and password=?";
//预编译的SQL执行对象,创建对象时对SQL语句进行了编译
/**
* 由于创建对象时已经将SQL语句逻辑部分编译完成
* 后期不会被用户输入的内容所影响
* 从而解决了SQL注入的问题
*/
PreparedStatement ps = connection.prepareStatement(sql);
//setString方法替换掉sql中的?,1代表第一个问号,username代表替换进去的值
ps.setString(1, username);
ps.setString(2, password);
//此时exe