【MyBatis 6】Statement

本文介绍了如何在Java中使用PreparedStatement进行批量操作数据库,包括addBatch(),executeBatch()等方法,强调了其在防止SQL注入攻击中的重要性,以及CallableStatement的使用。此外,还提到了XML中的statementType选择和Java开发的学习资源推荐。

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

对于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,是使用的参数替换,也就是索引占位符,我们的#会转换为?再设置对应的参数的值。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

本次面试答案,以及收集到的大厂必问面试题分享:

字节跳动超高难度三面java程序员面经,大厂的面试都这么变态吗?

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
71a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

本次面试答案,以及收集到的大厂必问面试题分享:

[外链图片转存中…(img-SaZsv0IE-1712253567856)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

### MyBatis生成语句无效的原因及解决方案 在使用MyBatis Generator(MBG)时,如果出现`Invalid bound statement (not found)`错误,通常表明MyBatis无法找到对应的SQL语句。以下是可能的原因及解决方案: #### 1. Mapper接口与XML文件未正确匹配 MyBatis通过Mapper接口和XML文件的命名规则来绑定SQL语句。如果Mapper接口的全限定名与XML文件中的`namespace`不一致,则会导致MyBatis无法找到对应的SQL语句[^1]。 **解决方案**: 确保Mapper接口的全限定名与XML文件中的`namespace`完全一致。例如,如果Mapper接口为`com.example.mapper.UserMapper`,则XML文件的`namespace`应为`com.example.mapper.UserMapper`。 ```xml <mapper namespace="com.example.mapper.UserMapper"> <!-- SQL statements --> </mapper> ``` #### 2. XML文件未被正确加载 如果XML文件未被正确加载到MyBatis配置中,MyBatis将无法识别其中定义的SQL语句[^3]。 **解决方案**: 检查MyBatis的配置文件(如`mybatis-config.xml`),确保已正确引入Mapper XML文件。可以通过以下方式之一引入: - 使用`<mappers>`标签直接指定XML路径: ```xml <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> ``` - 或者通过扫描包的方式自动加载Mapper接口: ```xml <mappers> <package name="com.example.mapper"/> </mappers> ``` #### 3. SQL语句ID未正确引用 在调用SQL语句时,需要通过`namespace.id`的形式引用。如果引用的ID与XML文件中定义的ID不一致,则会导致错误[^1]。 **解决方案**: 确保调用时使用的ID与XML文件中定义的ID一致。例如,如果XML文件中有如下定义: ```xml <select id="selectUserById" resultType="User"> SELECT * FROM user WHERE uid = #{uid} </select> ``` 则调用时应使用`selectUserById`作为ID。 #### 4. MBG生成的代码存在问题 有时,MBG生成的代码可能存在一些问题,例如Mapper接口或XML文件的命名不规范,或者生成的SQL语句不符合预期[^4]。 **解决方案**: - 检查生成的Mapper接口和XML文件,确保其结构和内容正确。 - 如果发现问题,可以手动调整生成的代码,或者修改MBG的配置文件以生成符合需求的代码。 #### 5. Spring Boot集成问题 在Spring Boot项目中,如果未正确配置MyBatis Generator,可能导致生成的代码无法正常工作[^2]。 **解决方案**: - 确保已在`pom.xml`或`build.gradle`中正确引入MyBatis Generator及相关依赖。 - 配置`generatorConfig.xml`文件,确保生成的代码符合项目需求。 - 在Spring Boot配置文件中,添加MyBatis的相关配置,例如: ```yaml mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.model ``` --- ### 示例代码 以下是一个简单的示例,展示如何正确配置MyBatis Generator生成的代码: #### Mapper接口 ```java public interface UserMapper { @Select("SELECT * FROM user WHERE uid = #{uid}") User selectUserById(int uid); } ``` #### XML文件 ```xml <mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="User"> SELECT * FROM user WHERE uid = #{uid} </select> </mapper> ``` #### MyBatis配置文件 ```xml <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值