不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据(取出Result结果集中的字段(不同类型))

本文介绍如何在未知表结构的情况下使用JDBC读取表信息,并通过ResultSetMetaData获取列名和类型,再根据不同类型读取数据。示例中创建了一个名为test的表并插入数据,通过Java程序实现了连接数据库、执行查询并将结果存储到Vector容器中。

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

概要: 使用jdbc 如果在不知道表结构的情况下,如何读出表信息?

使用ResultSetMetaData;

然后使用getColumnType 获取column 类型

使用getColumnName 获取column名字

根据类型,使用ResultSet 的getInt("column1")....获取每个字段的值

本文使用 Vector 做为容器,把拿到的查询结果,临时放在容器内。

1.   数据库准备

     a. create database study;

  b. create table 

 

CREATE TABLE `test` (   `id` int(11) NOT NULL DEFAULT '0',   `name` varchar(10) DEFAULT NULL, 
`birthday` datetime DEFAULT NULL, `score` double DEFAULT NULL, `info` text,
PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

mysql> desc test;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | 0       |       |
| name     | varchar(10) | YES  |     | NULL    |       |
| birthday | datetime    | YES  |     | NULL    |       |
| score    | double      | YES  |     | NULL    |       |
| info     | text        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

  c. 插入几条数据

mysql> insert into test values(20131026,'Marry','1983-10-18 21:11:13',65.5,'she
is so nice');

2. 下载mysql jdbc connector

http://dev.mysql.com/downloads/connector/j/

3.创建相应的类

复制代码
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.util.Scanner;
public class DBConnection {

    public static Connection getDBConnection() throws Exception {
       try{
        Connection con = null;
        Scanner input=new Scanner(System.in);
        System.out.println("please enter the IP");
        String ip=input.next();
        if(ip.matches("\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}"))
        {
            System.out.println("Your IP is:\n"+ip);
        }
        else
        {
            ip="127.0.0.1";
            System.out.println("Invaild IP address use default:\n"+ip);
        }
        System.out.println("please enter the ODBC port");
        int port=input.nextInt();
        if(1000<port && port < 50000)
        {
            System.out.println("your port is :\n"+port);
        }
        else
        {
            port=3306;
            System.out.println("Invaild port use defalt port:\n"+port);
        }
        System.out.println("please enter the UserName");
        String user=input.next();
        System.out.println("please enter the Password");
        String password =input.next();
        
        String url="jdbc:mysql://"+ip+":"+port+"/"+"study"; 
       // String url="jdbc:mysql://localhost:3306/study";
        System.out.println(url);
        String driver ="com.mysql.jdbc.Driver";
        Class.forName(driver);
        con = DriverManager.getConnection(url,"root", "3edc4rfv");
        DatabaseMetaData  dma = con.getMetaData();//get the database info
        System.out.println("Connected to:" + dma.getURL()); 
        System.out.println("Driver " + dma.getDriverName()); 

        return con;       
       }
       catch (Exception e) {

           System.out.println("[Error] Connection refused: connect");
           e.printStackTrace();
           return null;
       }

       

    }

}
复制代码
复制代码
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
public class mysql {

    static void runquery() throws SQLException
    {
        Connection con=null ;       
          
        long start=System.currentTimeMillis();          //count runtime
        ResultSetMetaData resultMetaData;
        try{
            
            con = DBConnection.getDBConnection();
            if(con==null){
                System.out.println("can't open DBConnection");
            }
            con.setAutoCommit(false);
           
               System.out.println("enter the sql you want excute\n eg select * from test;");
              Statement stmt = con.createStatement();
              String sql=new Scanner(System.in).nextLine();
ResultSet rs =stmt.executeQuery(sql); resultMetaData=rs.getMetaData(); int cols = resultMetaData.getColumnCount(); //get the count of all the coulums ,this will be 5 Vector currentRow = new Vector(); while(rs.next()) { for (int j = 1; j < cols; j++) { switch (resultMetaData.getColumnType(j)) //translate the column of table type to java type then write to vector { case Types.VARCHAR: currentRow.addElement(rs.getString(resultMetaData.getColumnName(j))); break; case Types.INTEGER: currentRow.addElement(new Integer(rs.getInt(resultMetaData.getColumnName(j)))); break; case Types.TIMESTAMP: currentRow.addElement(rs.getDate(resultMetaData.getColumnName(j))); break; case Types.DOUBLE: currentRow.addElement(rs.getDouble(resultMetaData.getColumnName(j))); break; case Types.FLOAT: currentRow.addElement(rs.getFloat(resultMetaData.getColumnName(j))); break; case Types.CLOB: currentRow.addElement(rs.getBlob(resultMetaData.getColumnName(j))); break; default: currentRow.add("error"); } } System.out.println(currentRow); currentRow.clear(); } } catch (Exception e) { e.printStackTrace(); } con.close(); long end=System.currentTimeMillis(); System.out.println(end-start); } public static void main(String[] args) throws SQLException { // TODO Auto-generated method stub System.out.println("enter the query SQL you want run\nex. select * from test ") ; runquery(); }
复制代码

 

运行结果:

ex. select * from test 
please enter the IP
localhost
Invaild IP address use default:
127.0.0.1
please enter the ODBC port
3306
your port is :
3306
please enter the UserName
root
please enter the Password
3edc4rfv
jdbc:mysql://127.0.0.1:3306/study
Connected to:jdbc:mysql://127.0.0.1:3306/study
Driver MySQL Connector Java
enter the sql you want excute
 eg select * from test;
select * from test;
[20131024, Jason, 1980-05-07, 60.5]
[20131025, Young, 1988-01-09, 56.8]
[20131026, Marry, 1983-10-18, 65.5]
31977
enter the  instert SQL you want run

 

转载请注明出处: http://www.cnblogs.com/tobecrazy/ 
<think>我们面对的问题是如何在JMeter的同一个JDBC取样器中执行多条SQL查询并分别提取每个查询的结果。根据引用[2],JMeter的JDBC Request元件默认支持在单个"Query"字段中编写多条SQL语句。但我们可以通过一些方法来实现。 参考引用[2]和引用[4]提供的方法,我们可以采用以下两种主要方式: 1. 使用多个JDBC Request元件:为每个SQL语句单独创建一个JDBC Request元件,然后分别提取每个查询的结果。 2. 使用事务(如果数据库支持):在单个JDBC Request元件中,通过事务将多条SQL语句组合在一起(如使用BEGIN TRANSACTION和COMMIT),但这种方法并能直接分别提取每个查询的结果,因为JDBC Request默认只返回最后一个查询的结果。 然而,我们的需求是在同一个取样器中执行多个查询并分别提取结果。因此,我们需要考虑其他方法。 实际上,根据引用[3]和引用[4],我们可以通过以下步骤实现: - 在同一个JDBC Request中执行多条SQL语句,但需要数据库驱动程序支持(例如MySQL允许在查询中使用分号分隔多条语句)。 - 然后,通过配置JDBC Request的“Result Variable Name”来获取所有结果,然后使用BeanShell或JSR223后置处理器来分别处理这些结果。 但是,请注意,根据引用[2],JMeter的JDBC Request默认只执行第一条语句,或者只返回最后一条语句的结果。因此,我们需要确保数据库驱动支持多条语句执行,并且需要正确配置。 具体步骤: 方法一:使用多个JDBC Request元件(推荐,简单可靠) 1. 为每个SQL查询创建一个JDBC Request取样器。 2. 在每个JDBC Request中,分别设置查询语句,并分别提取变量(通过“Variable Names”字段)。 3. 这样,每个查询的结果都可以独立提取和使用。 方法二:在同一个JDBC Request中执行多条语句(需要数据库支持) 1. 在JDBC Request的“Query”字段中,使用分号(或其他数据库支持的分隔符)分隔多条SQL语句。 2. 设置JDBC Request的“Result Set Handling”为“Store as String”(或者使用其他方式),然后通过后置处理器解析结果字符串。 3. 但是,这种方法并直接支持分别提取每个查询的结果列,因为JDBC Request默认只处理一个结果(通常是最后一个)。因此,我们需要使用额外的处理来获取多个结果。 实际上,根据JMeter的官方文档和社区实践,JDBC Request默认只返回第一个结果(或最后一个,取决于驱动)。因此,更可靠的方法是使用方法一。 然而,如果坚持要在同一个取样器中执行多条语句并获取多个结果,我们可以通过以下方式: 1. 在JDBC Request的“Query”字段中写入多条语句(用分号分隔)。 2. 在“Variable Names”字段中,我们可以指定一个前缀(如`result`),然后JMeter会将结果存储为变量:`result_1`, `result_2`, ...(但注意,这实际上是针对同一个结果的多行,而是多个结果)。 3. 实际上,JDBC Request只能处理一个结果。因此,这种方法可能行通。 所以,我们可能需要使用存储过程或者使用脚本来处理多个结果。但这样会增加复杂性。 鉴于以上分析,我们推荐使用方法一:使用多个JDBC Request元件。这样每个查询的结果都可以独立提取,并且简单可靠。 下面,我们将详细描述方法一的步骤: 步骤1:配置JDBC连接池 - 添加一个JDBC Connection Configuration”元件。 - 配置数据库连接参数,包括: Variable Name: 例如 `mysql_db` (这个名称将在后续的JDBC Request中使用) Database URL: 例如 `jdbc:mysql://localhost:3306/test` JDBC Driver Class: 选择对应的驱动,例如 `com.mysql.jdbc.Driver` Username: 数据库用户名 Password: 数据库密码 步骤2:为每个SQL查询添加一个JDBC Request取样器 - 添加第一个JDBC Request: Variable Name: 填写与连接池相同的名称(如 `mysql_db`) SQL Query: 输入第一条SQL语句,例如:`SELECT id, name FROM users WHERE id = 1;` Variable Names: 填写变量名前缀,例如 `user_id,user_name` (注意:用逗号分隔,变量个数与查询的列数一致) Result variable name: 可选,如果留空,则结果会存储在以`user_id_1`, `user_name_1`这样的变量中(第一行数据)。如果有多行,则会有`user_id_1`, `user_name_1`(第一行),`user_id_2`, `user_name_2`(第二行)等。 - 添加第二个JDBC Request: Variable Name: 同样填写 `mysql_db` SQL Query: 输入第二条SQL语句,例如:`SELECT product_id, price FROM products WHERE user_id = ${user_id_1};` (这里使用了第一个查询提取的变量) Variable Names: 例如 `prod_id,prod_price` 步骤3:使用提取的变量 - 在后续的请求中,通过`${user_id_1}`, `${user_name_1}`, `${prod_id_1}`, `${prod_price_1}`等方式引用变量。 注意:如果查询返回多行数据,则变量会以`{变量名}_{行号}`的形式存储,例如`user_id_1`、`user_id_2`等。 外,引用[3]中提到,还可以通过“Result variable name”将整个结果存储为一个变量(通常是对象),然后使用BeanShell或JSR223脚本来处理。但是,这种方法较为复杂,一般推荐,除非有特殊需求。 因此,我们推荐使用多个JDBC Request元件,每个元件执行一个查询并提取变量,然后在后续元件中使用这些变量。 相关问题: 1. 如何在JMeter中配置JDBC连接池? 2. 如何从JDBC查询结果中提取变量并在后续请求中使用? 3. 如果数据库支持同时执行多条SQL语句,在JMeter中应该如何处理? 4. 如何确保多个JDBC请求使用一个数据库连接? 5. 如何处理JDBC查询返回多行数据的情况?</think>### 在 JMeter 中执行多条 SQL 语句并提取结果的配置方法 根据引用内容[2][3][4],JMeter 的 JDBC Request 元件默认**支持**在单个"Query"字段中直接执行多条 SQL 语句。以下是两种可靠解决方案: --- ### 方法一:使用多个 JDBC Request 元件(推荐) **步骤**: 1. **配置连接池** 添加 `JDBC Connection Configuration`: - `Variable Name`:定义连接池名称(如 `mysql_pool`) - `Database URL`:`jdbc:mysql://host:port/dbname` - `JDBC Driver Class`:选择对应驱动(如 MySQL 选 `com.mysql.jdbc.Driver`) - 填写数据库账号密码[^3] 2. **添加多个 JDBC Request** 为每条 SQL 创建独立取样器: ```sql -- JDBC Request 1 SELECT id, name FROM users WHERE status = 1; ``` - `Variable Name`:与连接池名称一致(`mysql_pool`) - `Variable Names`:设置变量前缀(如 `user_id,user_name`) - 结果将存储为 `user_id_1`, `user_name_1`(第1行), `user_id_2`...等[^3] ```sql -- JDBC Request 2 SELECT product_id, price FROM orders WHERE user_id = ${user_id_1}; ``` - 直接引用上一步的变量 `${user_id_1}` 3. **提取多列数据** 在后续请求中使用 `${user_id_1}`, `${product_id_1}` 等变量 --- ### 方法二:单请求执行多条语句(需数据库支持) **步骤**: 1. **启用多语句执行** 在 `JDBC Connection Configuration` 的 `Database URL` 后添加参数: ``` jdbc:mysql://host:port/dbname?allowMultiQueries=true ``` 2. **编写事务语句** 在单个 JDBC Request 中使用 `BEGIN`/`COMMIT`: ```sql BEGIN; SELECT id INTO @uid FROM users WHERE email='test@example.com'; UPDATE orders SET status=2 WHERE user_id=@uid; COMMIT; ``` - 需数据库支持事务(如 MySQL InnoDB)[^2] 3. **结果提取** 通过 `Result Variable Name` 存储结果对象,用 BeanShell 脚本解析多个结果[^3]。 --- ### 关键注意事项 1. **变量作用域** JDBC 提取的变量仅在**当前取样器后续元件**中有效,跨线程需使用 `__setProperty()` 转为全局变量。 2. **分页查询优化** 若单查询返回多行数据,在 `Variable Names` 添加 `_#` 后缀(如 `prod_#`)可限制存储行数[^3]。 3. **参数化查询** 根据引用[4],不同用户执行不同 SQL 时,可将 SQL 语句存入 CSV 文件,用 `${SQL_Statement}` 调用。 --- ### 执行流程示例 ```mermaid graph TD A[JDBC连接池配置] --> B[JDBC Request 1:查询用户] B --> C[提取 user_id_1, user_name_1] C --> D[JDBC Request 2:查询订单] D --> E[提取 product_id_1, price_1] E --> F[HTTP请求使用提取的变量] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值