23.Jmeter基础---全面介绍JDBC Request

一、基本配置

1.首先我们先了解一下,不同数据库的驱动类和URL格式


2.将MySQL的JDBC驱动jar包复制到Jmeter的lib目录下,本文中使用的是 mysql-connector-java-8.0.16.jar 

或者在Jmeter的Test Plan中直接引入jar包,如下图所示:

MySQL驱动下载:https://mvnrepository.com/artifact/mysql/mysql-connector-java

二、配置JDBC Connection Configuration

JDBC Request经常需要配合配置元件JDBC Connection Configuration一起使用,先来看一下JDBC Connection Configuration的相关配置。

这里我们主要关注Variable Name Bound to Pool和Database Connection Configuration两部分内容,其它字段可以保持默认值。

Variable Name数据库连接池的名称
Database URL数据库的URL,jdbc:mysql://ip Of The Server:port/表名
JDBC Driver classJDBC驱动
Username要连接的数据库名称
Password要连接的数据库密码

三、配置JDBC Request

Variable Name数据库连接池的名称,需要与JDBC Connection Configuration的Variable Name名称保持一致
Query填写要被执行的SQL语句
Parameter valus参数值
Parameter types参数类型
Variable names保存sql语句返回结果的变量名
Result variable name创建一个对象变量,保存所有返回的结果
Query timeout查询超时时间
Handle result set定义如何处理由callable statements语句返回的结果

我们添加一个监听器,保存脚本运行一次,查看执行结果。

 需要注意的是,Query Type不同时,对应执行代码也不一样:

(1)Query Type为Select Statement时,
对应执行代码为:stmt = conn.createStatement(); ResultSet rs = null; rs = stmt.executeQuery(sql); return getStringFromResultSet(rs).getBytes(ENCODING);
(2)Query Type为Callable Statement时,
对应执行代码为:CallableStatement cstmt = getCallableStatement(conn); int out[]=setArguments(cstmt); boolean hasResultSet = cstmt.execute(); String sb = resultSetsToString(cstmt,hasResultSet, out); return sb.getBytes(ENCODING);
(3)Query Type为Update Statement时,
对应执行代码为:stmt = conn.createStatement(); stmt.executeUpdate(sql); int updateCount = stmt.getUpdateCount(); String results = updateCount + " updates"; return results.getBytes(ENCODING);
(4)Query Type为Prepared Select Statement时,
对应执行代码为:PreparedStatement pstmt = getPreparedStatement(conn); setArguments(pstmt); ResultSet rs = null; rs = pstmt.executeQuery(); return getStringFromResultSet(rs).getBytes(ENCODING);
(5)Query Type为Prepared Update Statement时,
对应执行代码为: PreparedStatement pstmt = getPreparedStatement(conn); setArguments(pstmt); pstmt.executeUpdate(); String sb = resultSetsToString(pstmt,false,null); return sb.getBytes(ENCODING);
(6)Query Type为Rollback时,
对应执行代码为: conn.rollback(); return ROLLBACK.getBytes(ENCODING);
(7)Query Type为Commit时,
对应执行代码为:conn.commit(); return COMMIT.getBytes(ENCODING);
(8)Query Type为AutoCommit(false)时,
对应执行代码为:conn.setAutoCommit(false); return AUTOCOMMIT_FALSE.getBytes(ENCODING);
(9)Query Type为AutoCommit(true)时,
对应执行代码为: conn.setAutoCommit(true); return AUTOCOMMIT_TRUE.getBytes(ENCODING);
(10)其它情况直接抛异常:
throw new UnsupportedOperationException("Unexpected query type: "+_queryType);

四、JDBC Request参数化

(一):自定义用户变量,然后进行引用

1.在Test Plan界面User Defined Variables中定义需要的变量

2.在JDBC Request界面SQL Query输入框中以${变量名}的形式引用变量

(二):在SQL语句中使用“ ?”作占位符,并传递参数值和参数类型

        传递的参数值有常量和变量之分。

1.当传递的参数值是常量时,如下图所示,传入的用户ID和用户号码:

2.当传递的参数值是变量时,如下图中的${user_id}:

五、Variables names参数使用方法

Variable names:保存sql语句返回结果的变量名,如果给这个参数设置了值,会保存sql语句返回的数据和返回数据的总行数。

idnamephone
A_1MikeC_1
A_2LucyC_2

假如,sql语句返回2行,3列,且Variables names设置为A, ,C,那么如下变量会被设置为:

A_#=2 (总行数)  A_1=第1列, 第1行  A_2=第1列, 第2行   

C_#=2 (总行数)    C_1=第3列, 第1行  C_2=第3列, 第2行

~如果返回结果为0,那么A_#和C_#会被设置为0,其它变量不会设置值。

~如果第一次返回6行数据,第二次只返回3行数据,那么第一次那多的3行数据变量会被清除。

~可以使用${A_#}、${A_1}...来获取相应的值

我们以上面的数据库为例,设置Variables names的值为p1、p2,并添加Debug Sampler

来查看输出结果。根据数据库的实际情况,我可以预期p1_#的值为22,p1_1的值为

e59af3ba1110f433bd2b0f4996011cab,结果如图正确~

附:SQL参数化

SQL参数化:

Parameter values:参数值
Parameter types:参数类型

  1.使用变量

    SELECT * FROM m_users WHERE id = ${id};

  2.使用问号

    SELECT * FROM m_users WHERE id = ? AND name = ? ;

    Parameter values:10,shuzf
    Parameter types:VARCHAR,VARCHAR

  3.使用变量和问号

    SELECT * FROM m_users WHERE id = ? AND name = ? ;

    Parameter values:${id},shuzf
    Parameter types:VARCHAR,VARCHAR

3.返回值取值

Variable names:保存sql语句返回结果的变量名

  1.假如返回结果又三个字段,四条记录 

    Variable names:A,B,C         //ABC表示每列

    ${A_#}、${B_#} 、${C_#}       取总行数4

    ${A_1}   取第1列第1行数据

    ${A_2}   取第1列第2行数据

    ${C_1}   取第3列第1行数据

    ${C_4}   取第3列第4行数据

Result variable name:创建一个对象变量,保存所有返回的结果

  Result variable name:shuzf

  获取具体值的方法:columnValue = vars.getObject("resultObject").get(0).get("shuzf");

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊Sei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值