为什么要使用PreparedStatement
1.使用Statement需要拼写SQL语句,很辛苦且很容易出错
2.可以有效地禁止SQL注入
SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令,从而利用系统的 SQL 引擎完成恶意行为的做法
对于 Java 而言,要防范 SQL 注入,只要用 PreparedStatement 取代 Statement 就可以了
SELECT * FROM users WHERE username = 'a' OR password = 'AND password = ' OR '1' = '1';
String username = "a' OR password = ";
String password = " OR '1' = '1";
String sql = "SELECT * FROM users WHERE username='"+ username +"' AND password='"+ password +"'";
使用PreparedStatement代替Statement的话
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement:是Statement的子接口,可以传入带占位符的SQL语句,并且提供了补充占位符变量的方法
package jdbc;
import java.util.Date;
import org.junit.Test;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
/**
使用PreparedStatement 是Statement的子接口,可以传入带占位符的SQL语句,并且提供了补充占位符变量的地方
1.创建PreparedStatement
String sql = "INSERT INTO examstudent VALUES(?,?,?,?,?,?,?)"
PreparedStatement ps = conn.prepareStatement(sql);
2.调用PreparedStatement的SetXxx(int index, Object val)设置占位符的值 (index的值从1开始)
3.执行SQL语句:executeQuery()或executeUpdate(),注意:执行时不再需要传入sql语句
*/
public class TestPreparedStatement {
@Test
public void TestPreparedStatement() {
Connection conn = null;
PreparedStatement preparedStatement = null;
try {
conn = (Connection) JDBCTools.getConnection();
String sql = "INSERT INTO customer VALUES(?,?,?,?)";
preparedStatement = (PreparedStatement) conn.prepareStatement(sql);
preparedStatement.setInt(1, 1);
preparedStatement.setString(2, "Skye");
preparedStatement.setString(2, "skye@163.com");
preparedStatement.setDate(3, (java.sql.Date) new Date(new java.util.Date().getTime()));
preparedStatement.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally {
JDBCTools.release(null, preparedStatement, conn);
}
}
}