Statement用于执行不带参数的简单SQL语句,并返回它所生成的结果,每次执行SQL豫剧时,数据库都要编译该SQL语句。

Satatement stmt = conn.getStatement();
stmt.executeUpdate("insert into client values("aa","aaa")");

PreparedStatement表示预编译的SQL语句的对象,用于执行带参数的预编译的SQL语句。

CallableStatement则提供了用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数。

虽然Statement对象与PreparedStatement对象能够完成相同的功能,但是相比之下,PreparedStatement具有以下优点:

1.效率更高。

在使用PreparedStatement对象执行SQL命令时,命令会被数据库进行编译和解析,并放到命令缓冲区,然后,每当执行同一个PreparedStatement对象时,由于在缓存区中可以发现预编译的命令,虽然它会被再解析一次,但是不会被再一次编译,是可以重复使用的,能够有效提高系统性能,因此,如果要执行插入,更新,删除等操作,最好使用PreparedSatement。鉴于此,PreparedStatement适用于存在大量用户的企业级应用软件中。

2.代码可读性和可维护性更好。

下两种方法分别使用Statement和PreparedStatement来执行SQL语句,显然方法二具有更好的可读性。

方法1:

stmt.executeUpdate("insert into t(col1,xol2) values('"+var2+"','"+var2+"')");

方法2:

perstmt = con.prepareStatement("insert into tb_name(col1,col2) values(?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);

3.安全性更好。

使用PreparedStatement能够预防SQL注入攻击,所谓SQL注入,指的是通过把SQL命令插入到Web表单提交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器,达到执行恶意SQL命令的目的。注入只对SQL语句的编译过程有破坏作用,而执行阶段只是把输入串作为数据处理,不再需要对SQL语句进行解析,因此也就避免了类似select * from user where name='aa' and password='bb' or 1=1的sql注入问题的发生。

CallableStatement由prepareCall()方法所创建,它为所有的DBMS(Database Management System)提供了一种以标准形式调用已存储过程的方法。它从PreparedStatement中继承了用于处理输入参数的方法,而且还增加了调用数据库中的存储过程和函数以及设置输出类型参数的功能。

转载于:https://www.cnblogs.com/LoganChen/p/6816713.html

Statement, PreparedStatement和CallableStatement的区别相关推荐

  1. JDBC--Statement,PreparedStatement,CallableStatement的区别

    JDBC: Statement(接口)      | PreparedStatement(接口)      | CallableStatement(接口) 以上三者为继承关系. 1).概念: Stat ...

  2. JDBC:PreparedStatement与Statement在使用时的区别

    PreparedStatement与Statement在使用时的区别 1.Statement: a.写sql语句 b.然后再执行executeUpdate(sql)或executeQuery(sql) ...

  3. PreparedStatement和CallableStatement都可以调用存储过程

    2019独角兽企业重金招聘Python工程师标准>>> 他们都可以调用存储过程,上午收了下主要区别.但是等于放屁,说了一大推也没说个所以然,就看见了这一句,说是CallableSta ...

  4. Statement和PreparedStatement的含义及区别

    Statement和PreparedStatement的含义 Statement java.sql.Statement public interface Statementextends Wrappe ...

  5. JAVA基础知识学习全覆盖

    文章目录 一.JAVA基础知识 1.一些基本概念 1.Stringbuffer 2.局部变量成员变量 3.反射机制 4.protect 5.pow(x,y) 6.final ,finally,fina ...

  6. 震撼,java面试题整合(良心制作)11万多字拿去。持续更新【可以收藏】

    一.javaSE面试题整合 Java部分 JDK中哪些类是不能继承的?[信雅达面试题] [参考答案] 不能继承的是类是那些用final关键字修饰的类.一般比较基本的类型或防止扩展类无意间破坏原来方法的 ...

  7. Java架构师之旅(二十九 附录《MyBatis3 用户指南》中文版)

    夜光序言: 岁月波光粼粼,赋予爱与生命,唯有生活不能被他人代替,只会有寂寞相随~~ 正文: MyBatis 3 2010.08.01  翻译的一个版本,虽难比较老了,但是有一些基础还是值得学习,毕竟是 ...

  8. 学习MyBatis3这一篇就够了

    目录 第一章 MyBatis3概述 1.1.概述 1.2.特点 1.3.对比 1.4.官网 1.5.下载 第二章 MyBatis3的增删改查 2.1.环境准备 2.2.创建工程 2.3.导入依赖 2. ...

  9. 疯狂Java讲义(十三)----第五部分

    1.  Javar 的 RowSet RowSet接口继承了ResultSet接口,RowSet接口下包含JdbcRowSet.CachedRowSet.FilteredRowSet.JoinRowS ...

最新文章

  1. Java三大主流开源工作流引擎技术分析
  2. 识别网络应用所使用的协议Amap
  3. vue中的倒计时跳转页面问题和axios网络请求this作用域问题
  4. 5进程间锁:进程间pthread_mutex,文件锁
  5. myeclipse 2016 ci3破解教程(含软件下载)
  6. 关于H264通过RTP传输的打包方式
  7. linux SHELL之结构化命令
  8. Vue.js学习总结(2)——Vue.js2.X + ElementUI开发环境搭建
  9. linux 脚本 格式化,Formatting Long Lines 格式化多行字符的shell脚本
  10. Python教学视频(七)分支结构
  11. 基于Labview开发TestStand用户界面时ConnectCommand List
  12. LNK1169 LNK2005错误
  13. centos 7下搭建wiki系统
  14. 行人重识别论文阅读7-基于图卷积的行人骨架识别
  15. 08_MySQL的函数
  16. 斐讯dns劫持,路由器DNS被劫持的解决办法
  17. 揭开均线系统的神秘面纱_揭开动态规划的神秘面纱
  18. 打字游戏c语言easyx,打字小游戏(天降字母)Visual Studio+EasyX
  19. 相机靶面尺寸和视场角换算
  20. Bzoj3687简单题(bitset)

热门文章

  1. Android 异步消息处理机制(Handler 、 Looper 、MessageQueue)源码解析
  2. 【问链-EOS公开课】第八课 EOS 数据库与持久化 API(一)
  3. 宝峰uv5r怎么设置信道_极蜂D301对讲机和宝峰UV5R 半月评
  4. oracle 强制恢复,oracle数据库恢复
  5. vue 箭头函数兼容性_前端学习计划之VUE学习(二)
  6. 特征值与特征向量(二)
  7. 自编码的matlab代码,深度学习自动编码机MATLAB实现
  8. mysql 异常关机后 无法查数据_MySQL数据库非法关机造成数据表损坏怎么排查 | 学步园...
  9. linux 设置变量在脚本之外可用,linux – 在ssh上运行脚本时,环境变量不可用
  10. java线程协作_java 线程间的协作