2022-08-19 PreparedStatement

嚴華  金牌会员 | 2022-9-16 17:18:29 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 831|帖子 831|积分 2493

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();
案例

修改教师信息
  1.       Connection conn = null;
  2.       PreparedStatement pstmt = null;
  3.       try {
  4.           conn = JDBCUtil.getConnection();
  5.           String sql = "update teacher set name = ? where id = ?";
  6.           // 预编译
  7.           pstmt = conn.prepareStatement(sql);
  8.           // 给占位符赋值,根据位置
  9.           pstmt.setString(1,"JJ");
  10.           pstmt.setInt(2,6);
  11.           // 正式执行sql
  12.           int i = pstmt.executeUpdate();
  13.           System.out.println(i);
  14.       } catch (ClassNotFoundException e) {
  15.           throw new RuntimeException(e);
  16.       } catch (SQLException e) {
  17.           throw new RuntimeException(e);
  18.       } catch (IOException e) {
  19.           throw new RuntimeException(e);
  20.       } finally {
  21.           JDBCUtil.close(conn,pstmt);
  22.       }
  23.   }
复制代码
总结

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表