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

标签 java android jdbc

我正在尝试编写一个应用程序作为 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() 中的数据不是类型中的数据,而是数据库中的数据。 它们是二进制形式。 它是这样的:

enter image description here

所以。如果你想读取表的行/列,你需要知道一件事——数据类型。 这被称为

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){}*/

            }
        }

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

类似的东西(当然这不存在,它就像展示思维方式):

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

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

最佳答案

如果您只需要所有列中所有值的字符串表示形式,则可以使用 ResultSet getString(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();
    }

关于java - Android/Java JDBC MySQL - 获取行 - 有效算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190013/

相关文章:

java - 如何在不使用准备好的语句的情况下清理 SQL

java - 使用 java 转换器类生成新图像

java - 为什么我们必须将InputStream转换为ByteArrayOutputStream?

android - Facebook android API 函数 executeGraphPathRequestAsync 未给出预期结果

java - 如何让 android 复选框禁用布局中的某些内容?

java - db2 驱动程序为smallint 返回java.lang.Integer

elasticsearch - 重复数据-Elasticsearch

java - AndEngine如何让 Sprite 在调用jump方法时不跳转

java - 不带 'ln' 的字符串的 System.out.print

java - 将 java 字符串转换为与 replaceAll 中的正则表达式兼容的字符串