PreparedStatement

PreparedStatement接口是Statement的子接口,它表示一条预编译过的SQL语句

什么是SQL注入

SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或命令,从而利用系统的SQL引擎完成恶意行为的做法。

preparedstatement和statement的区别

PreparedStatement:
PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。
Statement
使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

Why?为什么要用它??

使用PreparedStatement:是Statement的子接口,可以传入带占位符的SQL语句,提供了补充占位符变量的方法。
PreparedStatement ps=conn.preparedStatement(sql);
可以看到将sql作为参数传入了,就不需要我们在费力拼写了。
变成了这样的形式
String sql="insert into examstudent values(?,?,?,?,?,?,?)";

如何使用??建立连接

connection = JDBCUtil.getConnection();

写SQL语句

String sql = "select * from account where username = ? and password = ?";

创建preparedStatement对象预编译

pstmt = connection.prepareStatement(sql);

给占位符赋值(执行参数)

pstmt.setString(1,username); pstmt.setString(2,password);
//写SQL语句 String sql = "select * from user where username = ? and password = ?";
//预编译 pstmt = conn.prepareStatement(sql);
//占位符赋值 pstmt.setString(1,"aaa"); pstmt.setString(2,"b' or '1' = '1");

执行SQL

ResultSet resultSet1 = pstmt.executeQuery();

案例

修改教师信息

      Connection conn = null;      PreparedStatement pstmt = null;      try {          conn = JDBCUtil.getConnection();          String sql = "update teacher set name = ? where id = ?";          // 预编译          pstmt = conn.prepareStatement(sql);          // 给占位符赋值,根据位置          pstmt.setString(1,"JJ");          pstmt.setInt(2,6);          // 正式执行sql          int i = pstmt.executeUpdate();          System.out.println(i);      } catch (ClassNotFoundException e) {          throw new RuntimeException(e);      } catch (SQLException e) {          throw new RuntimeException(e);      } catch (IOException e) {          throw new RuntimeException(e);      } finally {          JDBCUtil.close(conn,pstmt);      }  }

总结

关于PreparedStatement接口,需要重点记住的是:
1. PreparedStatement可以写参数化查询,比Statement能获得更好的性能。
2. 对于PreparedStatement来说,数据库可以使用已经编译过及定义好的执行计划,这种预处理语句查询比普通的查询运行速度更快。
3. PreparedStatement可以阻止常见的SQL注入式攻击。
4. PreparedStatement可以写动态查询语句
5. PreparedStatement与java.sql.Connection对象是关联的,一旦你关闭了connection,PreparedStatement也没法使用了。
6. “?” 叫做占位符。