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. “?” 叫做占位符。