PreperedStatement是Statement的子类,它的实例对象可以通过调用 Connection.preparedStatement()方法获得,相对于Statement对象而言:PreperedStatement可以避 免SQL注入的问题。
Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
PreparedStatement可对SQL进行预编译,从而提高数据库的执行效率。并且PreperedStatement对于 sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。
使用PreparedStatement对象完成对数据库的CRUD操作
查询防止sql注入
public class TestSelect { public static void main(String[] args) { login("lisi","123456"); } public static void login(String name ,String password) { Connection co=null; PreparedStatement pr = null; ResultSet rs=null; try { co = JdbcUtils.getConnection(); String sql = "select * from users where `name`=? and `password`= ? "; pr = co.prepareStatement(sql); pr.setObject(1,name); pr.setObject(2,password); rs = pr.executeQuery(); while (rs.next()){ System.out.println(rs.getString("name")); System.out.println(rs.getString("password")); } } catch (SQLException throwables) { throwables.printStackTrace(); }finally { JdbcUtils.release(co,pr,rs); } } }
原理:执行的时候参数会用引号包起来,并把参数中的引号作为转义字符,从而避免了参数也作为条件 的一部分