我在mySQL服务器上有一个表,其数据存储如下
Name Goal New Used Total Pace
Jill 5 6 1 7 0
Bob 5 2 3 5 0
Ann 5 1 2 3 0
它可以有更多的东西。我需要做的是从mySQL服务器读取数据并将其加载到2D String数组中。我已经知道如何加载sql数据......问题是我不能,为了我的生活,弄清楚如何将它加载到数组中。
将数据加载到数组后,它将被发送到要加载的表中以供查看。
所以基本上数组的输出必须是:
Jill 5 6 1 7 0
Bob 5 2 3 5 0
Ann 5 1 2 3 0
这是我的代码:
public String[][] fillInTableForStoreFromArchive(String Person, String DateTable) throws SQLException{
stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery("SELECT * FROM `" +DateTable+ "` WHERE name = '" +Person+"'");
int rows = 0; //column number
int columns = 6; //row number
rows = getAmountOfSalesPeople(DateTable).length;
String[][] data = new String[rows][columns];
String name = null;
int goal = 0, New = 0, used = 0,total = 0,pace = 0;
while(rs.next()){
name = rs.getString("Name");
goal = rs.getInt("Goal");
New = rs.getInt("New");
used = rs.getInt("Used");
// total = rs.getInt("total");
// pace = rs.getInt("pace");
String[] mData = { name, new Integer(goal).toString(),
new Integer(New).toString(), new Integer(used).toString(),
new Integer(New + used).toString(),new Integer(pace).toString() };
for(int row = 0; row >data.length; row ++){
data[row] = mData;
}
}
for(int row = 0; row < data.length; row++){
for(int col = 0; col <data[row].length; col++){
System.out.print(data[row][col] + " ");
}
System.out.println();
}
return data;
}
答案 0 :(得分:1)
看看你的例子,我会假设名字是唯一的。由于你有混合类型,字符串和整数,你不能将它们全部放在一个数组中,除非你将整数存储为字符串。一种解决方案是创建一个包含名称及其相关数据的Object ......毕竟,这是在面向对象编程中所做的事情。
除非我将数据存储在Map中,其中name是键,int数组是值:
HashMap<String, int[]> myMap = new HashMap<String, int[]>();
String name;
int[] myData;
while(rs.next())
{
myData = new int[5];
name = rs.getString("Name");
myData[0] = rs.getInt("Goal");
myData[1] = rs.getInt("New");
myData[2] = rs.getInt("Used");
myData[3] = rs.getInt("total");
myData[4] = rs.getInt("pace");
myMap.put(name, myData);
}
在需要时(提示:使用Map.Entry<String, int[]>
),例如在toString()
中,迭代地图是微不足道的。数组没有“输出”,因此您需要使用对象或单独的方法来根据需要格式化数据。
另外,请避免使用像New这样的变量名称......没有任何好处可以出现与关键字相同但名称大写不同的名称。
答案 1 :(得分:0)
您的问题是您尝试将数组行作为独立实体处理,方法是设置其他数组的行...
...无法在“行”级别设置2D数组 - 因为它们不使用行级指针进行管理 - 为了设置2D数组行,您必须显式设置和定义行和列'for'在行中的每一列,在适当的“for”循环中。
答案 2 :(得分:0)
获得mdata
数组后,您希望将其用作data
中的一行。相反,您正在使用一个循环并分配到多个位置。
您应该使用计数器来跟踪您添加的行数,然后使用该计数器将mdata
放在正确的位置。
答案 3 :(得分:0)
作为@Paul解决方案的结果,您可以在类中描述您的表并通过正常的OO原则访问它。这将完全消除对阵列的需求。
比如说:
public class Player {
private String name;
private int goal;
private int _new; //As @Paul pointed out you should not use reserved keywords
private int used;
private int total;
private int pace;
public Player(String name, int goal, int _new, int used, int total, int pace) {
this.name = name;
this.goal = goal;
this._new = _new;
this.used = used;
this.total = total;
this.pace = pace;
}
public String getName() {
return name;
}
public int getGoal() {
return goal;
}
public int get_new() {
return _new;
}
public int getUsed() {
return used;
}
public int getTotal() {
return total;
}
public int getPace() {
return pace;
}
}
你的初始化循环变得更具可读性:
List<Player> players = new ArrayList<Player>();
while (rs.next()) {
players.add(new Player(rs.getString("Name"),
rs.getInt("Goal"),
rs.getInt("New"),
rs.getInt("Used"),
rs.getInt("total"),
rs.getInt("pace")));
}
如果你想从你的数据良好的方法打印信息,这里将重载播放器的toString或添加一个新的方法,比如dumpToString()。
public String dumpTostring() {
StringBuilder sb = new StringBuilder();
sb.append("Player ");
sb.append(name);
sb.append(" Goal=");
sb.append(goal);
sb.append(" New=");
sb.append(_new);
sb.append(" Used=");
sb.append(used);
sb.append(" Total=");
sb.append(total);
sb.append(" Pace=");
sb.append(pace);
return sb.toString();
}
然后只需调用in作为遍历列表的每个循环的一部分。