← 返回首页
JDBC教程(四)
发表时间:2020-03-21 14:39:18
讲解PreparedStatement

PreparedSatement是Statement的一个子接口。是SQL预处理执行对象。

使用PreparedStatement有以下特点: - PreparedStatement用于多次执行SQL语句。 - PreparedStatement接口在运行时接受输入参数。 - PreparedStatement接口扩展了Statement接口。 - 我们可以为PreparedStatement动态提供参数。

PreparedStatement常用方法与Statement完全相同。

1.PreparedStatement执行查询语句

        Connection conn = null;
        PreparedStatement pstmt = null;
        String sql = "";
        ResultSet rs = null;
        try {
            conn = DBUtils.getConnection();
            sql = "select * from students where sid = ?";
            //1.创建语句对象
            pstmt = conn.prepareStatement(sql);
            //2.传参数
            pstmt.setInt(1,3); //注意,第一个参数下标从1开始
            rs =  pstmt.executeQuery();
            while(rs.next()){
                System.out.println("学号:" + rs.getInt("sid") + "姓名:" + rs.getString("sname"));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        finally{

        }

2.PreparedStatement执行更新语句

实例,一次插入多条学生记录。

class Students{
    private String sname;
    private String gender;

    public Students() {
    }

    public Students(String sname, String gender) {
        this.sname = sname;
        this.gender = gender;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Students{" +
                "sname='" + sname + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}


public class PreparedStatementDemo {

    public static List<Students> studentsList = new ArrayList<Students>();
    private static PreparedStatement pstmt = null;

    public static void initStudentsList(){
        for(int i=1;i<=10;i++){
            Students s = new Students("张"+i,"男");
            studentsList.add(s);
        }
    }

    public static void main(String[] args) {

        initStudentsList();

        Connection conn = null;
        String sql = "";
        ResultSet rs = null;
        try {
            conn = DBUtils.getConnection();
            sql = "insert into students (sname,gender) values (?,?)";
            //1.创建语句对象
            pstmt = conn.prepareStatement(sql);
            studentsList.forEach(s->{
                try {
                    pstmt.setString(1, s.getSname());
                    pstmt.setString(2,s.getGender());
                    pstmt.executeUpdate();
                }catch(Exception ex){
                    ex.printStackTrace();
                }
            });

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        finally{
          //释放资源
        }
    }
}

3.Statement与PreparedStatement的区别

1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程。

2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理。

总结PreparedStatement的优点:

1)效率高. 使用PreparedStatement执行SQL命令时,命令会被数据库编译和解析,并放到命令缓冲区.以后每当执行同一个PreparedStatement对象时,预编译的命令就可以重复使用

2)代码可读性和可维护性好。

3)安全性好. 使用PreparedStatement可以防止SQL注入.

SQL注入,例如如下代码,可以绕过登录查询所有用户资料:

select * from user where name = ‘aa’ and password = ‘bb’ or 1=1