JDBC——PreparedStatement

为什么要使用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);
		}
	}
}

 

posted @ 2017-11-16 15:01  SkyeAngel  阅读(263)  评论(0编辑  收藏  举报