将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组
对于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取值说明:
-
STATEMENT:直接操作sql,不进行预编译,不带参数;
-
PREPARED:进行预编译,可带参数;
-
CALLABLE:执行存储过程;
注意:如果只为STATEMENT,那么sql就是直接进行的字符串拼接,这样为字符串需要加上引号,如果为PREPARED,是使用的参数替换,也就是索引占位符,我们的#会转换为?再设置对应的参数的值。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。


既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
本次面试答案,以及收集到的大厂必问面试题分享:

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
71a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />
本次面试答案,以及收集到的大厂必问面试题分享:
[外链图片转存中…(img-SaZsv0IE-1712253567856)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
本文介绍了如何在Java中使用PreparedStatement进行批量操作数据库,包括addBatch(),executeBatch()等方法,强调了其在防止SQL注入攻击中的重要性,以及CallableStatement的使用。此外,还提到了XML中的statementType选择和Java开发的学习资源推荐。
2467

被折叠的 条评论
为什么被折叠?



