我正在尝试编写一个应用程序作为 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){}*/
}
}
这……非常糟糕。您拥有数据,但您必须决定如何将其转换为人类可读的结果。 所以我的问题是: 有什么办法,如何直接获取类型而不用这么长的开关?
类似的东西(当然这不存在,它就像展示思维方式):
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/