不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据(转)

概要: 使用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/p/3390021.html

 

时间: 2025-01-30 11:32:17

不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据(转)的相关文章

mysql 数据库-mysql中表中列类型是枚举类型不能参与运算吗?

问题描述 mysql中表中列类型是枚举类型不能参与运算吗? 表结构: +------------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+-------+ | sporter_id | char(4) | YES |

MySQL 4.1.0 中文参考手册 --- 6.2 列类型

mysql|参考|参考手册|中文 MySQL 4.1.0 中文参考手册 --- 犬犬(心帆)翻译 MySQL Reference Manual for version 4.1.0-alpha. 6.2 列类型 MySQL 支持大量的列类型,它们可以被分为 3 类:数字类型.日期和时间类型以及字符串(字符)类型.这个章节首先给出可用类型的概述,并且总结各类型所需的存储需求,然后提供各类型中的类型范畴更详细的描述.概述有意地简化了.更详细的说明应该参考特写列类型的附加信息,例如你能为其指定值的允许格

MySQL的列类型

    数据库中的每个表都是由一个或多个列构成的.在用CREATE TABLE 语句创建一个表时,要为每列指定一个类型.列的类型比数据类型更为特殊,它仅仅是如"数"或"串"这样的通用类型.列的类型精确地描述了给定表列可能包含的值的种类,如SMALLINT 或VARCHAR( 3 2 ).    MySQL的列类型是一种手段,通过这种手段可以描述一个表列包含什么类型的值,这又决定了MySQL怎样处理这些值.例如,数值值既可用数值也可用串的列类型来存放,但是根据存放这些

datagridview-C# winform DataGridView中输入内容时候有下拉提示(数据库中表的内容)!!!!!

问题描述 C# winform DataGridView中输入内容时候有下拉提示(数据库中表的内容)!!!!! 如题,有参考代码吗 多谢多谢~~~~~~~~~~~~~在线等 最好是有实例代码的 解决方案 那列设置成combox类型列

ADO如何取得数据库中表的字段信息之一

若要取得数据库中表的字段信息,由以下RecordSet对象的属性可得知: ActualSize属性:字段的实际大小. DefinedSize属性:定义字段的大小. Type属性:字段类型,使用以下数字代表之:文字text:200 日期时间date:135 整数int/识别码:3 单精准度:4 双精准度:5 备注memo:201 是否yes/no:17 Name属性:字段名称. NumericScale属性:字段小数部份的位数. Precision属性:字段的整数和小数位数部份加起来的最多位数.取

在SQL2008查找某数据库中的列是否存在某个值

--SQL2008查找某数据库中的列是否存在某个值 create proc spFind_Column_In_DB ( @type int,--类型:1为文字类型.2为数值类型 @str nvarchar(100)--需要搜索的名字 ) as --创建临时表存放结果 create table #tbl(PK int identity primary key ,tbl sysname,col sysname) declare @tbl nvarchar(300),@col sysname,@sql

数据库中表的多余字段处理

问题描述 数据库中表的多余字段处理 在设计数据库资料目录管理的一张表时,其中有两个字段 一个HavezlFlag(标记此目录下是否含有资料) 另一个HaveSubDirFlag(标记此目录下是否含有目录类似文件夹),这 两个字段因为用户常添加和删除,所以不必存储,只要需要时再临时计算,这个用视图可以解决嘛,怎么解决,求详细方法. 解决方案 合理设计的表格不会有经常添加删除的字段,尤其是数据库里面数据多的时候这是严禁的操作,有些数据库一增删字段就锁整表,其它涉及这个表的操作就会进入等待状态. 如果

《Redis入门指南(第2版)》一3.3 散列类型

3.3 散列类型 小白只用了半个多小时就把访问统计和发表文章两个部分做好了.同时借助Bootstrap框架7,老师花了一小会儿时间教会了之前只涉猎过HTML的小白如何做出一个像样的网页界面. 7http://twitter.github.com/bootstrap. 接着小白发问: 接下来我想要做的功能是博客的文章列表页,我设想在列表页中每个文章只显示标题部分,可是使用您刚才介绍的方法,若想取得文章的标题,必须把整个文章数据字符串取出来反序列化,而其中占用空间最大的文章内容部分却是不需要的,这样

java-Java选中数据库中表页面生成字段

问题描述 Java选中数据库中表页面生成字段 选中下拉框中的表名 下面的多选按钮怎么自动生成选中 的表名的字段 解决方案 简单实现 首先用JDBC中的 ResultSetMetaData 的getColumnCount()返回 ResultSet 中的列数 再用 getColumnName(int) 返回列序号为 int 的列名 或 getColumnLabel(int)返回此列暗含的标签; 最后就是JS判断打勾而已了. 有空可以去研究一般的orm框架··· 解决方案二: div+js可以实现