statement和prepareStatement 的区别

statement和prepareStatement 的区别????Java基础教程系列:Java基础教程系列????Java学习路线总结:搬砖工逆袭Java架构师????Java经典面试题大全:10万字208道Java经典面试题总结(附答案)????简介:Java领域优质创作者????、CSDN哪吒公众号作者✌、Java架构师奋斗者????????扫描主页左侧二维码,加入群聊,一起学习、一起进步????欢迎点赞????收藏⭐留言????一、【粉丝福利】送书啦,大家期待已久的Vue!本次活动送书规则:【送

大家好,又见面了,我是你们的朋友全栈君。

? 作者简介:CSDN2021博客之星亚军?、新星计划导师✌、博客专家?

? 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

目录

一、简介

二、statement的四种形式

1、executeQuery

2、executeUpdate

3、execute

4、Batch

三、PreparedStatement常用方法

1、boolean execute()

2、int executeUpdate()

3、void addBatch()

4、void clearParameters()

5、ResultSetMetaData getMetaData()

6、ParameterMetaData getParameterMetaData()

四、PreparedStatement代码实例

五、使用PreparedStatement能够预防SQL注入攻击

六、CallableStatement

七、xml中的statementType


一、简介

它们都是接口:

  • Statement继承自Wrapper
  • PreparedStatement继承自Statement
  • CallableStatement继承自PreparedStatement

Statement:直接操作sql,不进行预编译,不带参数;

PreparedStatement:进行预编译,可带参数;

CallableStatement:执行存储过程;

SQL的执行需要编译和解析。

Statement每次的执行都需要编译SQL。

PreparedStatement会预编译,会被缓冲,在缓存区中可以发现预编译的命令,虽然会被再次解析,但不会被再次编译,能够有效提高系统性能。

二、statement的四种形式

  • executeQuery
  • executeUpdate
  • execute
  • Batch 

1、executeQuery

用于产生单个结果集的语句,用于执行 SELECT 语句(SELECT无疑是是使用最多的 SQL 语句) ,返回值为ResultSet。

2、executeUpdate

用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。

executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

3、execute

用于执行返回多个结果集、多个更新计数或二者组合的语句。execute对与结果的处理比较麻烦

execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。

返回值指示类型情况:如果下一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在更多结果,则返回 false。

Statement stmt = conn.createStatement();
if(stmt.execute(sql)){
    ResultSet rs = stmt.getResultSet();
}else{
    log.info("受影响的行 {}", stmt.getUpdateCount());
}

(1)ResultSet getResultSet()

以 ResultSet 对象的形式获取当前结果

(2)int getUpdateCount()

以更新计数的形式获取当前结果;如果结果为 ResultSet 对象或没有更多结果,则返回 -1

(3)boolean getMoreResults()

移动到此 Statement 对象的下一个结果,如果其为 ResultSet 对象,则返回 true,并隐式关闭利用方法 getResultSet 获取的所有当前 ResultSet 对象

(4)boolean getMoreResults(int current)

将此 Statement 对象移动到下一个结果,根据给定标志指定的指令处理所有当前 ResultSet 对象;如果下一个结果为 ResultSet 对象,则返回 true

(5)default long getLargeUpdateCount()

4、Batch

(1)void addBatch(String sql)

将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中

(2)void clearBatch()

清空此 Statement 对象的当前 SQL 命令列表

(3)int[] executeBatch()

 将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组                 

对于batch操作,简单说就是有一个列表,保存了执行命令。

add是添加方法,clear就是清空方法,execute就是执行列表内命令。

如下面示例,将1000个“张三”分十次插入数据库:

for(int i=0;i<1000;i++){
    String sql = "insert into user(id,name,age) values (i,'张三"+i+"',18)";
    stmt.addBatch(sql);
    if(i%100 == 0){
        stmt.executeBatch();
        stmt.clearBatch();
    }
}

三、PreparedStatement常用方法

1、boolean execute()

在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。

ResultSet executeQuery()

在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。

2、int executeUpdate()

在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。

3、void addBatch()

将一组参数添加到此 PreparedStatement 对象的批处理命令中。

4、void clearParameters()

立即清除当前参数值。

5、ResultSetMetaData getMetaData()

获取包含有关 ResultSet 对象列信息的 ResultSetMetaData 对象,ResultSet 对象将在执行此 PreparedStatement 对象时返回

6、ParameterMetaData getParameterMetaData()

获取此 PreparedStatement 对象的参数的编号、类型和属性。

四、PreparedStatement代码实例

String sql = "insert into user(id,name,age) values (?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql, Statement.NO_GENERATED_KEYS);
ps.setInt(1,1);
ps.setString(2,"哪吒");
ps.setInt(3,18);
ps.executeUpdate();

五、使用PreparedStatement能够预防SQL注入攻击

假如登录SQL为select * from user where name=’zs’ and password=’123′ ,如果在登录框密码处输入 “123 or 1=1”,那么SQL就成为了

select * from user where name=’zs and password=’123′ or 1=1  ,这就是SQL注入。

所谓SQL注入就是将SQL语句片段插入到被执行的语句中,把SQL命令插入到Web表单提交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器,达到执行恶意SQL命令的目的。

PreparedStatement通过预编译,原有的SQL语句中的参数转换为占位符?的形式,相当于变成了填空题,不管你输入的内容是什么,都是作为参数,而不可能作为SQL的一部分

(要注意 #与$的区别)

你把密码输入为’123 or 1=1’然后提交,他会转换为  select * from user where name=’zs and password=’123 or 1=1’,输入内容都转换为纯粹参数。

六、CallableStatement

CallableStatement继承自prepareStatement,实现了存储过程函数调用的方法以及对于输出的处理。

CallableStatement调用存储过程和函数,一个很重要的部分就是输出的处理。

在JDBC中需要使用registerOutParameter将参数注册为输出,registerOutParameter的责任就是申明XXX参数是一个输出。

对于这个参数可以使用int  parameterIndex 下标索引(1开始)也可以使用String parameterName来指明,对于参数对应的类型也需要指明。

七、xml中的statementType

在mapper文件中可以使用statementType标记使用什么的对象操作SQL语句。

xml文件中通过statementType参数,选择适合的对象。

statementType取值说明:

  1. STATEMENT:直接操作sql,不进行预编译,不带参数;
  2. PREPARED:进行预编译,可带参数;
  3. CALLABLE:执行存储过程;

注意:如果只为STATEMENT,那么sql就是直接进行的字符串拼接,这样为字符串需要加上引号,如果为PREPARED,是使用的参数替换,也就是索引占位符,我们的#会转换为?再设置对应的参数的值。

? 作者简介:CSDN2021博客之星亚军?、新星计划导师✌、博客专家?

? 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

statement和prepareStatement 的区别

关注公众号,备注1024,获取Java学习路线思维导图、加入万粉计划交流群

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/131511.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • explain如何查看mysql_MySQL Explain详解[通俗易懂]

    explain如何查看mysql_MySQL Explain详解[通俗易懂]在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略…

    2022年10月18日
  • 航信金税接口「建议收藏」

    航信金税接口「建议收藏」我看到很多的航信接口,但是我发现好多都是中间商在宣传自己的接口,偶尔几个也是要积分的,像我这种白piao党那是没有积分的,下面是我给现在在做航信接口的基友们的一点建议前期条件1.本地电脑的金税环境(开票软件,智税集成)2.航信测试盘,测试注册文件(必需品)3.开发文档(一般没有,有的话也是经过二次修改过的那种)一些需要注意的地方:引用的dll是taxCardx,这个一般装了金税环境…

  • Landsat8卫星介绍[通俗易懂]

    Landsat8卫星介绍[通俗易懂]2013年2月11号,NASA成功发射了Landsat8卫星,为走过了四十年辉煌岁月的Landsat计划重新注入新鲜血液,设计使用寿命为至少5年。Landsat8上携带有两个主要载荷:OLI和TIRS,其中OLI(全称:OperationalLandImager,陆地成像仪)由卡罗拉多州的鲍尔航天技术公司研制;TIRS(全称:ThermalInfraredSensor,热红外传感器

  • phpstrom 2021 激活码[免费获取]

    (phpstrom 2021 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.htmlMLZPB5EL5Q-eyJsaWN…

  • 集合【7】— 遍历ArrayList集合三种方法「建议收藏」

    集合【7】— 遍历ArrayList集合三种方法「建议收藏」遍历ArrayList集合三种方法何为遍历?逐个获取集合中的每个元素1使用下标2使用forEach循环3使用迭代器Iteratorimportjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importorg.junit.Test;/***遍历ArrayList集合元素*…

  • java手机编程软件_手机java编程软件下载[通俗易懂]

    java手机编程软件_手机java编程软件下载[通俗易懂]手机java编程软件安卓版是一款专为java开发人员服务的编辑客户端应用,利用手机java编程软件手机安卓版实时进行相关编辑还能进行简单的编译,运行单个小程序等,提供您的效率。功能介绍手机java编程软件安卓版是一款将openjdk中关于编译java工程的代码移植到了安卓平台。手机java编程软件手机安卓版支持添加jar格式的lib文件,并且将编译后的程序dex化,以便在安卓设备上运行。在编译和运…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号