【Jmeter】——Update Statement & Callable Statement & Select Statement 分析

本文详细介绍了使用JMeter测试SQL语句的方法,包括SELECT、UPDATE、INSERT及DELETE等语句的测试技巧。重点讲解了UpdateStatement组件的使用,并对比了SelectStatement与CallableStatement的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



前言


  上一篇博客讲了如何测试多条sql语句


  可能某些细节没有提到


  一般来说不太影响



  但对于像我这样的孩子来说,某些地方会钻一丢丢角尖

  就会感觉很别扭,少点什么似的


  本来今天是主讲Update Statement的,正好这里的东西也不是太多

  就顺带着和Callable Statement做个对比给客官们分析一下

  捎带说两句Select Statement


如果是刚刚接触,想敲个小demo的客官,建议先看前几篇博客:

因为某些基本的配置,在下面不会过多阐述了,只会论其差异之处


【Jmeter】—— 程序的安装、配置

【Jmeter】——测试简单Sql语句

【Jmeter】——测试多条Sql语句




正文


  大概之前两篇博客都是在说如何测试select语句

  当然这也正是我们测试sql语句时的重点


  但不能说就不知道如何测试非select语句

  现在咱们就说一说如何测试update、insert以及delete语句


基本测试


  Query Type处选择Update Statement,在Query处写 需要测试的语句 如下图:



  需要提醒的是测试的sql语句时, 默 认 情 况 下 都会对数据库进行更新的

  我没有更改,因为个人感觉这样更有利于数据的观察,在文章结尾处会给大家介绍如何修改


  下面看一下数据库在jmeter运行前后的 数 据 表 对 照

  


测试多条 非select语句


  在 Query Type 为 Update Statement 时,是可以 同 时 测 试 多个非select语句的,比如:



  虽然Jmeter中的响应数据显示的是更新了一行,但其实数 据 库 已经按照上面的sql语句改变了,如图:

 


比较Callable Statement、Select Statement


  其实Select Statement、Update Statement、Callable Statement三者之间区别都是一点点的


放在一起对比看下,会更容易一点:

Select Statement:仅支持测试select语句,并且一次只能测试一条

Update Statement:支持测试非select语句,并且支持测试多条

         若其中夹杂select语句,自动忽略

         若第一条语句为select语句,报错

Callable Statement:只要语法正确,任何语句,再多的条数都能支持


最后统一说一句:在Jmeter中测试sql语句,默认会更新到数据库,但是不像在数据库中执行SQL语句那么严格

比如:删除某一数据时,如果数据库中没有改数据,而Jmeter并不会报错



  下面给大家看个例子:


  初始状态数据库的数据:



  按从上到下的顺序排列的两个JDBC Request内容:

 


  Jmeter运行之后两个Request分别对应的响应数据:

 


  最后给大家看一下,Jmeter运行之后数据库中的数据:



更新数据库配置修改


  在JDBC Connection Configuration的配置中


  Auto Commit为True时,会自动提交更新到数据库

  Auto Commit为False时,不会更新到数据库,不影响其他数据



结语


           九牛一毛



<think>我们正在讨论预编译SELECT语句(PreparedSelectStatement)在SQL中的应用。根据提供的引用,我们可以总结以下关键点: 1. **预编译语句的基本概念**:预编译语句(Prepared Statement)是一种包含占位符(通常用`?`表示)的SQL语句模板。在创建时,SQL语句中的参数值不指定,而是在执行前通过应用程序设置(引用[1][2])。 2. **预编译语句的优势**:- **防止SQL注入**:通过参数化查询,将用户输入作为参数传递,而不是直接拼接到SQL字符串中,从而避免恶意SQL注入(引用[3])。-**性能提升**:预编译语句可以被数据库预编译并缓存,当多次执行同一语句(仅参数不同)时,可提高执行效率(引用[2])。 3. **在JDBC中的使用**:在Java中,使用`PreparedStatement`接口来执行预编译SQL语句。例如,执行一个带参数的SELECT查询:```javaString sql= "SELECT *FROM productsWHERE productcode =?";PreparedStatement pstmt =connection.prepareStatement(sql);pstmt.setString(1, "S001");//设置第一个参数的值ResultSetrs =pstmt.executeQuery();``` 4. **在JMeter中的使用**:在JMeter的JDBC请求中,也可以使用预编译SELECT语句。有两种方式设置参数(引用[5]):-方法一:使用`${变量名}`引用变量。-方法二:使用占位符`?`,然后在“Parameter values”中按顺序填写参数值。 现在,针对用户的问题“prepared selectstatement inSQL”,我们可以给出以下回答: ###预编译SELECT语句(PreparedSelectStatement)在SQL中的应用预编译SELECT语句是一种参数化的SQL查询方式,它使用占位符(如`?`)代替具体的值,然后在执行前设置这些参数值。这种方式在数据库编程中被广泛使用,特别是在安全性和性能方面有显著优势。 ####1.基本语法在SQL中,预编译SELECT语句的模板如下:```sqlSELECT列名FROM表名WHERE条件列= ?; ```其中,`?`是占位符,代表一个参数。实际执行时,每个`?`都会被具体的参数值替换。 ####2.工作原理- **预编译阶段**:数据库接收到带占位符的SQL语句后,会进行语法解析、优化,并生成执行计划,然后缓存该计划。- **执行阶段**:当应用程序设置具体参数值并执行时,数据库直接使用缓存的执行计划,从而减少重复解析和优化的开销。 ####3.主要优势- **安全性**:由于参数值在预编译后传入,不会改变SQL语句的结构,因此可以有效防止SQL注入攻击(引用[3])。- **性能**:对于需要多次执行的相同SELECT语句(仅参数不同),预编译可以显著提高执行速度(引用[2])。- **可读性与维护性**:参数化查询使代码更清晰,易于维护。####4.在编程中的使用示例以下是在不同环境中使用预编译SELECT语句的示例:**Java (JDBC)**```java//假设已经获得数据库连接Connection对象Stringsql ="SELECTname,price FROMproducts WHEREcategory =? ANDprice >?";PreparedStatement pstmt =conn.prepareStatement(sql); pstmt.setString(1,"Electronics");//设置第一个参数(类别)pstmt.setDouble(2,100.0);//设置第二个参数(价格) ResultSet rs= pstmt.executeQuery();while (rs.next()) {//处理结果集}``` **JMeter(JDBC Request)**在JMeter中配置JDBC请求时:- **Query Type**:选择`PreparedSelect Statement` -**SQLQuery**:填写带`?`的SQL语句- **Parameter values**:填写参数值,多个参数用逗号分隔(如:`Electronics,100.0`) -**Parametertypes**:可以指定参数类型(如:`VARCHAR,DECIMAL`)####5.注意事项- **参数设置顺序**:占位符`?`的顺序必须与设置参数的顺序一致(从左到右,从1开始)。- **参数类型匹配**:设置参数时需确保数据类型与数据库列类型匹配,否则可能抛出异常。- **资源释放**:使用后务必关闭`PreparedStatement`和`ResultSet`以释放数据库资源。###总结预编译SELECT语句是数据库编程中的重要技术,它通过参数化查询提高安全性和性能。在开发中,应优先使用`PreparedStatement`代替普通的`Statement`来执行SQL查询(引用[3])。§§相关问题§§1.预编译SELECT语句在哪些情况下性能提升最明显? 2.除了防止SQL注入,预编译语句还有哪些安全优势? 3.在非SELECT语句(如INSERT、UPDATE)中,预编译语句如何使用? 4.不同数据库(如MySQL、Oracle)对预编译语句的支持有何差异?</think>### 预编译 SELECT 语句(Prepared Select Statement)详解 预编译 SELECT 语句是 SQL 中的一种**参数化查询技术**,通过占位符(`?`)替代具体值,在执行前预编译 SQL 结构,提升安全性和性能。 #### 核心原理 ```sql SELECT * FROM products WHERE productcode = ?; -- 占位符?代替实际参数 ``` 1. **预编译阶段** SQL 模板发送到数据库,数据库解析并优化执行计划,缓存编译结果[^2]。 2. **参数绑定阶段** 程序将具体参数值(如 `"A001"`)绑定到占位符: ```java pstmt.setString(1, "A001"); // JDBC 参数绑定示例 ``` 3. **执行阶段** 数据库直接使用缓存的执行计划执行查询[^1]。 #### 核心优势 1. **安全防注入** - 用户输入始终作为**数据参数**处理,不与 SQL 结构拼接 - 彻底避免 `' OR 1=1 --` 类注入攻击[^3] *示例漏洞:* ```sql -- 普通Statement(危险!) "SELECT * FROM users WHERE name='" + userInput + "'" -- 输入 `admin' -- ` 可绕过验证 ``` 2. **性能提升** - 相同 SQL 模板多次执行时,复用预编译的执行计划 - 减少数据库解析开销,尤其适合循环查询[^2] 3. **代码可读性** - 参数与 SQL 逻辑分离,维护更清晰 #### 具体实现示例 **Java JDBC 代码**: ```java String sql = "SELECT name, price FROM products WHERE category = ? AND stock > ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, "Electronics"); // 绑定第一个? pstmt.setInt(2, 10); // 绑定第二个? ResultSet rs = pstmt.executeQuery(); // 处理结果集... } ``` **JMeter 配置**(引用[^5]): - **Query Type**: `Prepared Select Statement` - **SQL Query**: `SELECT * FROM users WHERE email = ?` - **Parameter values**: `${test_email}` 或直接值 - **Parameter types**: `VARCHAR` (指定参数类型) #### 适用场景 1. 高频重复查询(如商品搜索) 2. 接受用户输入的查询界面 3. Web 应用数据库操作 4. 批量数据处理任务 > **注意**:预编译语句对动态表名/列名无效(如 `SELECT ? FROM table`),此类场景需结合白名单验证[^3]。 ---
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值