什么是预编译语句? 
预编译语句PreparedStatement是java.sql中的一个接口,它是Statement的子接口。通过Statement对象执行sql语句时,需要将sql语句发送给DBMS,由DBMS首先进行编译再执行(在创建通道的时候并不进行sql的编译工作,事实上也无法进行编译)。而通过PreparedStatement不同,在创建PreparedStatement对象时就指定了sql语句,该语句立即发送给DBMS进行编译,当该语句被执行时,DBMS直接运行编译后的sql语句,而不需要像其他sql语句那样首先将被编译。 
例如我们在向数据库插入数据:

一种是使用Statement对象

java.sql.Statement   stmt=conn.createStatement();

stmt.executeUpdate("insert into student(name,id,number,count) "

+ "values('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

另一种是使用PreparedStatement对象

String sql ="insertinto student values(null,?,?,?)";

//创建PreparedStatement对象时编译sql语句

java.sql.PreparedStatement pstmt=conn.preparedStatement(sql);              pstmt.setString(1,var1);

pstmt.setString(2,var2);

pstmt.setString(3,var3);

pstmt.setString(4,var4);

//当该语句被执行时,DBMS直接运行编译后的sql语句

使用占位符?代替

将参数与SQL语句分离出来,这样就可以方便对程序的更改和延续,同样,也可以减少不必要的错误
pstmt.executeUpdate();

什么时候使用预编译语句? 
当语句格式固定的时我们倾向于使用PreparedStatement,只有当语句格式无法预见时,才考虑使用Statement。 
一般在考虑反复使用一个sql语句时才使用预编译,预编译语句常常放在一个循环中使用(在这种情况下预编译的优势就很明显了),通过反复设置参数从而达到多次使用该语句;还有一个原因就是防止sql注入漏洞。

为什么使用预编译语句? 
1、提高效率 
当需要数据库进行数据插入、更新或者删除的时候,程序给发送整个sql语句给数据库处理和执行。数据库处理一条sql语句,需要完成对sql语句的解析、检查语法以及生成代码;一般来说,处理时间要比执行sql的时间长。预编译语句在创建的时候就已经将sql语句发送给了DBMS,完成了解析、检查语法以及生成代码的过程。因此,当一个sql语句需要执行多次时,使用预编译语句可以减少处理时间,提高执行效率。 
2、提高安全性 
恶意的sql语句 
Stringsql = “select * from user_tb where username= ‘”+username+”’and password = ‘”+password+”’; 
如果我们把[‘or’1’=’1]作为password传入,用户名随意,那么就可以随意登陆了。更有甚者,把[‘;drop table user_tb;]作为password传入,这就严重危害了数据库安全了。

PreparedStatement 预编译相关推荐

  1. PreparedStatement预编译的sql执行对象

    一.预编译,防sql注入 其中,设置参数值占位符索引从1开始:在由sql 连接对象创建 sql执行对象时候传入参数sql语句,在执行对象在执行方法时候就不用再传入sql语句: 数据库索引一般是从1开始 ...

  2. java安全(二):JDBC|sql注入|预编译

    给个关注?宝儿! 给个关注?宝儿! 给个关注?宝儿! 关注公众号:b1gpig信息安全,文章推送不错过 1 JDBC基础 JDBC(Java Database Connectivity)是Java提供 ...

  3. 5单个编译总会编译全部_JDBC【5】 JDBC预编译和拼接Sql对比

    在jdbc中,有三种方式执行sql,分别是使用Statement(sql拼接),PreparedStatement(预编译),还有一种CallableStatement(存储过程),在这里我就不介绍C ...

  4. jdbc(跟着宝哥学java:jdbc) jdbc概念,铁打步骤,jdbc封装,预编译对象,sql攻击

    1 概念 jdbc:java database connection 通过java连接数据库 sun公司为java连接所有数据库提供的一组接口; jdbc驱动:各个数据库厂家为自己的数据库根据jdbc ...

  5. mybatis以及预编译如何防止SQL注入

    SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者).[摘自] SQL injection - Wikipedia SQL ...

  6. java预编译啥意思_java预编译 java jdbc 预编译语句和普通语句的区别

    java中什么是预编译precompile?总有一天你恍然大悟,父母是你花心思,花时间最少,却最爱你的人. 什么是预编译?起什么作用的? . 在java中如何实现预编译?祝你幸福!这句话真俗.小编会祝 ...

  7. mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译

    mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...

  8. mysql预编译语句拼接查询_SQL语句预编译(查询)

    SQL语句预编译 SQL语句预编译能预防SQL注入提高安全性,是因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会 ...

  9. Java预编译和批处理

    预编译 package csdn.prepare.take;import java.sql.Connection; import java.sql.DriverManager; import java ...

最新文章

  1. 《理解 OpenStack + Ceph》---来自-[爱.知识]-推荐
  2. 俄罗斯、乌克兰程序员薪资大曝光!年薪普遍 15w+,女程序员比男程序员收入高?...
  3. mysql数据库优化课程---16、mysql慢查询和优化表空间
  4. redis的观察者模式----------发布订阅功能
  5. linux系统下对磁盘的,学会在Linux下对硬盘分区
  6. 正则表达式二 :贪婪与非贪婪
  7. 配置ftp服务器亲测可用
  8. 批量删除redis键
  9. SDWebImage的使用说明
  10. 单元词检索计算机,单元词法
  11. 电子病历基本架构与数据标准
  12. 人脸聚类--最好的防御是进攻
  13. 排序算法之 Heap Sort
  14. MATLAB 读取txt文件(importdata函数)
  15. java服务器项目,java项目服务器部署
  16. 需要计算机安装msxml,怎么在电脑上安装msxml6.0?教大家具体安装步骤
  17. matlab中ones函数的使用方法详细介绍(附matlab代码)
  18. 几种ARM编译器及IDE开发环境
  19. 史丰收速算 (蓝桥杯)
  20. android WIFI相关问题集合

热门文章

  1. ​什么是50ETF期权?
  2. java属于什么意向应聘岗位_请针对你意向的岗位简单介绍自己。
  3. 【硬件】电脑主机结构 | 总分总
  4. 【贪玩巴斯】Unity3D初学圣经(三)—— unity中的基础概念——scene场景,component组件,assets文件夹和Material材质,Mesh Renderer与shader
  5. php判断安卓还是苹果客户端
  6. html 最小边框宽度,div边框粗细
  7. 4G临近,最新高大上4G旗舰机型推荐
  8. 初学UI设计会接触什么 怎么用PS时间轴做动画
  9. 计算机科学与技术用惠普星15,设计与科技的完美融合惠普 x360
  10. 重返帝国各氪度阵容推荐