写点什么

【MyBatis 6】Statement,mysql 基础教程西泽 pdf

用户头像
极客good
关注
发布于: 刚刚

以更新计数的形式获取当前结果;如果结果为 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 passwo


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


rd='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:进行预编译,可带参数;

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
【MyBatis 6】Statement,mysql基础教程西泽pdf