PreparedStatement执行select语句,防止SQL注入

执行select语句

不带查询条件

String sql="select * from book";
PreparedStatement ps=conn.prepareStatement(sql);//预编译sql
ResultSet rs=ps.executeQuery();//执行查询
List list=new ArrayList();
while(rs.next()){
    Object[] array=new Object[columnNum];
    for(int i=0;i<columnNum;i++){
        array[i]=rs.getObject(i+1);
    }
    list.add(array);
}
rs.close();
ps.close();

PreparedStatement 与 Statement 执行过程基本相同,只有2处不一样

防止SQL注入

当有查询条件时,使用 ? 作为占位符,可以防止 SQL注入

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class PreparedStatement防止SQL注入 {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        String url = "jdbc:mysql://127.0.0.1:3308/scott?useSSL=false";

//        正常的用户名、密码
        String username = "lilei";
        String password = "123456";

        // sql注入
//        String username = "' or 1=1 #";
//        String password = "";


        // 加载驱动
        Class.forName("com.mysql.jdbc.Driver");

        Connection conn = DriverManager.getConnection(url, "root", "");

        String sql = "SELECT * FROM USER WHERE username=? and password=? ";
        System.out.println(sql);

        PreparedStatement ps=conn.prepareStatement(sql);//创建PreparedStatement接口对象时,需要传入sql,预编译sql
        ps.setObject(1,username);
        ps.setObject(2,password);
        ResultSet rs=ps.executeQuery();

        if (rs.next()) {
            String id = rs.getString(1);
            Object name = rs.getObject(2);
            Object passowrd = rs.getObject(3);

            System.out.println("登录成功!");
            System.out.println(id + "," + name + "," + passowrd);
        } else {// 没有查询到此用户、密码,说明登录失败
            System.out.println("输入用户名或密码错误,请重新输入!");
        }

        conn.close();
    }

}

原文出处:/show_1EF63mPrPThS.html