Android/Java JDBC MySQL - 获取行 - 有效算法

Posted

技术标签:

【中文标题】Android/Java JDBC MySQL - 获取行 - 有效算法【英文标题】:Android/Java JDBC MySQL - fetch rows - effective algorithm 【发布时间】:2015-12-09 22:14:35 【问题描述】:

我正在尝试将应用程序编写为 mysql 客户端,但遇到了我不想遵循的方式,因为我认为,即使可能,它也不是一个好方法。

我的项目中有 JDBC 驱动程序,我想获取所有行并将它们写入用户界面 - 只需将数据绘制到表中即可。

一切都以平常的方式开始:

    Statement stmt = DataStore.DataStoreClass.mysqlConn.createStatement() ; 
   /*I have static class for some data*/
    String query = "SELECT * FROM "+ DataStore.DataStoreClass.currentTable;
    ResultSet res = stmt.executeQuery(query);

现在,我们有一些回应

while (res.next()) 


这就是基础知识,到这里为止,一切正常。 但是绝对不行,在 res.next() 中不是类型的数据,而是在数据库中。 它们是二进制形式。 看起来是这样的:

所以。如果你想阅读表格的行/列,你需要知道一件事——数据类型。 这是由

调用的
res.getMetaData().getColumnTypeName();

返回一个带有名称的字符串。不幸的是,MySQL 使用了 22 种数据类型,其中至少 5 种(int 的所有变体,如 tinyint、bigint...)可以像“tinyint”或“tinyint unsigned”一样返回。也就是说,我们有 27 个东西可以通过这个命令返回。

因此,您有一个二进制字段,并且您想要收集数据。嗯,是的,这很简单......至少如果你知道会发生什么......

 /*This is inside while cycle with res.next()*/
    int columnIndex=1;
    int z = res.getInt(columnIndex);

好吧,但我不知道会发生什么。 以我的方式,这将是非常复杂的。

比方说,我们已经获取了表中使用的所有列类型,我们想要写下来,并且我们有一个字符串数组。另外,通过这种方式,我们也知道表的大小,如列数,因此我们声明了具有正确大小的新字符串数组以供将来使用

现在是编程的事情:

        while (res.next())
          String[] row = new String[res.getMetaData.getColumnCount()];
            for(int i=1; i<=res.getMetaData.getColumnCount(); i++)
                String monthString;
                switch (arrayWithDataTypeAtColumPosition[i]) 
                    case "Tinyint":  row[i] = Integer.toString(res.getInt(i));
                             break;
                    case "String":   row[i] = res.getString(i);
                             break;
                    case "Byte":     row[i] = Byte.toString(res.getByte(i));
                             break;
                    /*next all 24 other cases*/
                    

        sendRowToDisplay(row);
        /*SendRowToDisplay(row); only for illustration purposes only, 
        in real, this is in AsyncTask in doInBackground, 
       so you will use publishProgress(row); to send in to 
       @Override protected void onProgressUpdate (String[] s)*/

            
        

而且这……很糟糕。您拥有数据,但您必须决定如何将其转换为人类可读的结果。 所以我的问题是: 有什么办法,不用这个long long sswitch如何直接获取类型?

之类的(当然这个不存在,就是想展示一下思路):

while (res.next)
   for(int i=1; i<=res.getMetaData.getColumnCount(); i++)
   res.getDataByMetaDataColumnType().toString();
  

更重要的是,这对我来说非常有用,因为仅仅写下一行对我来说是不够的。我想点击该行并在下一个活动中编辑该行,这意味着,发送 SELECT * FROM Table WHERE column1=fetchedValue 然后做同样的事情,我将有相同的该死的开关来声明 TextEdit 的类型和值,它们应该加载到 TextEdits 中。然后,下一个相同的开关,它将从我在 TextEdits 中的字符串中获取正确的数据...

【问题讨论】:

【参考方案1】:

如果只需要所有列中所有值的字符串表示,可以使用ResultSetgetString(int index)方法。无论列的类型如何,值都将转换为String

这是一个例子:

    try (Connection con = getDatabaseConnection();) 
        try (Statement st = con.createStatement();) 
            try (ResultSet rs = st.executeQuery("SELECT * FROM TableName");) 
                ArrayList<ArrayList<String>> rows = new ArrayList<ArrayList<String>>();
                while (rs.next()) 
                    ArrayList<String> row = new ArrayList<String>();
                    for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) 
                        row.add(rs.getString(i + 1));
                    
                    rows.add(row);
                
                System.out.println(rows);
            
        
     catch (Exception e) 
        e.printStackTrace();
    

【讨论】:

好吧,但是如果 DB 中的列是 INT 呢?然后,您将拥有值 256888 作为 INT,作为一个数字。但是您会尝试将其写为 STRING。这意味着,字节流将被转换为字符串而不是 int。我不会去 goole 字符的 ASCII 值,但是,正如我正在查看的那样,Integer.toString(res.getInt(1)) 将返回 286888,因为我们已经将字节转换为它的 NUMERIC 表示,然后 thne数字转换成字符串。 res.getString(1) 会将字节流直接转换为字符串,所以你会得到,例如“qx7z”......我正确吗? 没有。 getString(...) 方法返回值的 String 表示形式,对于 int 256888 方法将返回 256888 对于 bit(1) 类型列将返回 01 等等。 它有效,谢谢,至少它将代码长度减少了一个该死的长开关:)

以上是关于Android/Java JDBC MySQL - 获取行 - 有效算法的主要内容,如果未能解决你的问题,请参考以下文章

jsp页面中怎么导入jdbc连接mysql

mysql jdbc驱动不能加载问题

在eclipse里jdbc连接mysql 怎么安装

com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定

使用 JDBC 访问远程 MySQL 数据库时出现 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定