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学习路线思维导图、加入万粉计划交流群

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • git查看分支图_git分支代码

    git查看分支图_git分支代码gitlog–oneline–graph–decorate–all–oneline 日志单行显示–graph 分支图显示–decorate 可显示分支名称–all 显示所有分支

    2022年9月30日
    2
  • 大数据管理与应用专业总结笔记

    大数据管理与应用专业总结笔记大数据管理与应用专业:数据科学教育特点:不仅依赖于传统的信息管理于信息系统专业,更依赖于计算机、数学、统计等学科。大数据专业十一门涉及广泛的交叉性的学科。大数据时代的下的理念(维克托·迈尔·舍恩伯格):一是更相关性而不是因果性;二是更关注数据的纷繁复杂,而不是数据的精准;三是全部数据,而不是抽样数据。维克托·迈尔·舍恩伯格:维克托·迈尔-舍恩伯格是十余年潜心研究数据科学的技术权威,是最早洞见大数据时代发展趋势的数据科学家之一,也是最受人尊敬的权威发言人之一。**目前的形势:**目前国内新增院校还不多

    2022年6月10日
    40
  • Node.js的安装及环境配置【超详细】

    Node.js的安装及环境配置【超详细】Step1:去官网下载安装包下载方式1:官网下载根据自己电脑系统及位数选择。注意:图中.msi和.zip格式区别:1、.msi是Windowsinstaller的数据包,实际上是一个数据库,提供安装,修改,卸载你所安装的程序。此外:它还包含有关安装过程本身的信息。例如:安装序列、目标文件夹路径、安装选项和控制安装过程的属性。2、.zip是一个压缩包,解压之后即可,不需要安装。…

    2022年6月11日
    38
  • 【Win10 64位 Modelsim安装教程】双击patch_dll.bat时一闪而过/找不到文件mgls.dll的解决方法

    【Win10 64位 Modelsim安装教程】双击patch_dll.bat时一闪而过/找不到文件mgls.dll的解决方法关于双击patch_dll.bat之后一闪而过,没有生成LICENSE.TXT的解决方案其实不是一闪而过,仔细看一下显示的是“找不到文件-mgls.dll”win+R,输入cmd在cmd中从根目录一步一步进入win64文件夹,运行patch_dll.bat即可。我安装的时候等了两分钟才生成LICENSE.TXT,所以回车后没反应的话,多等一会试试。如图:完整的破解教程其实破解…

    2022年5月23日
    1.0K
  • 蓝桥杯单片机PCF8591数据读取——湿度检测

    蓝桥杯单片机PCF8591数据读取——湿度检测

    2021年11月12日
    41
  • jquery unbind_java主函数

    jquery unbind_java主函数PHPuniqid()函数uniqid()函数基于以微秒计的当前时间,生成一个唯一的ID。PHPPHPuniqid()函数uniqid()函数基于以微秒计的当前时间,生成一个唯一的ID。注释:由于基于系统时间,通过该函数生成的ID不是最佳的。如需生成绝对唯一的ID,请使用md5()函数(请在字符串函数参考中查找)。echouniqid();?>本例产生32个字符的独…

    2025年8月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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