Java 在多维HashMap中存储MySQL查询中的多行
因此,我尝试将MySQL查询结果集存储到多维HashMap中,如下所示:Java 在多维HashMap中存储MySQL查询中的多行,java,mysql,hashmap,Java,Mysql,Hashmap,因此,我尝试将MySQL查询结果集存储到多维HashMap中,如下所示: public HashMap<String, HashMap<String, String>> getData(String query) { Statement stmt = null; HashMap<String, HashMap<String, String>> results = new HashMap<String, HashMa
public HashMap<String, HashMap<String, String>> getData(String query)
{
Statement stmt = null;
HashMap<String, HashMap<String, String>> results = new HashMap<String, HashMap<String, String>>();
try
{
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next())
{
for (int i = 1; i < rsmd.getColumnCount() + 1; i++)
{
results.put(Integer.toString(i - 1), new HashMap<String, String>());
results.get(Integer.toString(i - 1)).put(rsmd.getColumnLabel(i), rs.getString(i));
}
}
}
catch (SQLException ex)
{
ex.printStackTrace(System.out);
}
return results;
}
它只存储一行结果,我不知道为什么
0 = {Date=2014-11-04}
1 = {Num=1256}
2 = {ATime=null}
3 = {ALocCode=null}
4 = {DTime=1:00 PM}
5 = {DLocCode=JFK}
6 = {EstATime=8:00 PM}
7 = {EstDTime=1:00 PM}
8 = {EId=7624}
我的问题是,我唯一能说的是它与PHP有关,那就是我如何让它像这样存储
$result[0]['Date'] = '3214';
....
$result[1]['Date'] = '6426';
由于这正是我试图实现的目标?交换“行”和“列”的主要问题,下一个问题是每次放置字段时都要创建HashMap,正确的代码如下所示:
public Map<String, Map<String, String>> getData(final String query) {
final Map<String, Map<String, String>> results = new HashMap<>();
try (final Statement stmt = this.conn.createStatement(); final ResultSet rs = stmt.executeQuery(query);) {
final ResultSetMetaData rsmd = rs.getMetaData();
long rId = 0;
while (rs.next()) {
final Map<String, String> record = new HashMap<>();
for (int i = 1; i < (rsmd.getColumnCount() + 1); i++) {
record.put(rsmd.getColumnLabel(i), rs.getString(i));
}
results.put(String.valueOf(rId++), record);
}
} catch (final SQLException ex) {
ex.printStackTrace(System.out);
}
return results;
}
public static void printMap(final Map<?, ?> mp) {
for (final Entry<?, ?> entry : mp.entrySet()) {
final Object key = entry.getKey();
final Object value = entry.getValue();
if (value instanceof Map) {
System.out.println(key);
printMap((Map<?, ?>) value);
} else {
System.out.println(key + "=" + entry.getValue());
}
}
}
publicmap getData(最终字符串查询){
最终映射结果=新HashMap();
try(final Statement stmt=this.conn.createStatement();final ResultSet rs=stmt.executeQuery(查询);){
最终结果setMetadata rsmd=rs.getMetaData();
长rId=0;
while(rs.next()){
最终映射记录=新的HashMap();
对于(int i=1;i<(rsmd.getColumnCount()+1);i++){
record.put(rsmd.getColumnLabel(i)、rs.getString(i));
}
results.put(String.valueOf(rId++),record);
}
}捕获(最终SQLException ex){
例如printStackTrace(系统输出);
}
返回结果;
}
公共静态无效打印地图(最终地图mp){
for(最终条目:mp.entrySet()){
最终对象键=entry.getKey();
最终对象值=entry.getValue();
if(映射的值实例){
系统输出打印项次(键);
printMap((Map)值);
}否则{
System.out.println(key+“=”+entry.getValue());
}
}
}
交换“行”和“列”的主要问题,下一个问题是每次放置字段时都要创建HashMap,正确的代码如下所示:
public Map<String, Map<String, String>> getData(final String query) {
final Map<String, Map<String, String>> results = new HashMap<>();
try (final Statement stmt = this.conn.createStatement(); final ResultSet rs = stmt.executeQuery(query);) {
final ResultSetMetaData rsmd = rs.getMetaData();
long rId = 0;
while (rs.next()) {
final Map<String, String> record = new HashMap<>();
for (int i = 1; i < (rsmd.getColumnCount() + 1); i++) {
record.put(rsmd.getColumnLabel(i), rs.getString(i));
}
results.put(String.valueOf(rId++), record);
}
} catch (final SQLException ex) {
ex.printStackTrace(System.out);
}
return results;
}
public static void printMap(final Map<?, ?> mp) {
for (final Entry<?, ?> entry : mp.entrySet()) {
final Object key = entry.getKey();
final Object value = entry.getValue();
if (value instanceof Map) {
System.out.println(key);
printMap((Map<?, ?>) value);
} else {
System.out.println(key + "=" + entry.getValue());
}
}
}
publicmap getData(最终字符串查询){
最终映射结果=新HashMap();
try(final Statement stmt=this.conn.createStatement();final ResultSet rs=stmt.executeQuery(查询);){
最终结果setMetadata rsmd=rs.getMetaData();
长rId=0;
while(rs.next()){
最终映射记录=新的HashMap();
对于(int i=1;i<(rsmd.getColumnCount()+1);i++){
record.put(rsmd.getColumnLabel(i)、rs.getString(i));
}
results.put(String.valueOf(rId++),record);
}
}捕获(最终SQLException ex){
例如printStackTrace(系统输出);
}
返回结果;
}
公共静态无效打印地图(最终地图mp){
for(最终条目:mp.entrySet()){
最终对象键=entry.getKey();
最终对象值=entry.getValue();
if(映射的值实例){
系统输出打印项次(键);
printMap((Map)值);
}否则{
System.out.println(key+“=”+entry.getValue());
}
}
}
拉桑的回答有助于解决您需要解决的错误,但可以改进:
- 您需要对行而不是字符串进行数字访问(
)$result[0]['Date']
方法应使用全类型参数print
- 行应存储在
或TreeMap
或LinkedHashMap
中以保留行顺序<实际上,code>ArrayList更适合您的情况ArrayList
- 列应存储在
中以保留列顺序LinkedHashMap
- 不要捕获异常并继续。允许它级联到调用方
public List<Map<String, String>> getData(final String query) throws SQLException {
final List<Map<String, String>> results = new ArrayList<>();
try (Statement stmt = this.conn.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
ResultSetMetaData metaData = rs.getMetaData();
while (rs.next()) {
Map<String, String> record = new LinkedHashMap<>();
for (int col = 1; col <= metaData.getColumnCount(); col++)
record.put(metaData.getColumnLabel(col), rs.getString(col));
results.add(record);
}
}
return results;
}
public static void printMap(List<Map<String, String>> rows) {
for (int rowNum = 0; rowNum < rows.size(); rowNum++)
System.out.println(rowNum + " = " + rows.get(rowNum));
}
公共列表getData(最终字符串查询)引发SQLException{
最终列表结果=新建ArrayList();
try(语句stmt=this.conn.createStatement();
结果集rs=stmt.executeQuery(查询)){
ResultSetMetaData元数据=rs.getMetaData();
while(rs.next()){
映射记录=新建LinkedHashMap();
对于(int col=1;col,Lashane的回答有助于解决您需要解决的错误,但可以改进:
- 您需要对行而不是字符串进行数字访问(
)$result[0]['Date']
方法应使用全类型参数print
- 行应该存储在
或TreeMap
或LinkedHashMap
中以保留行顺序。ArrayList
实际上更适合您的情况ArrayList
- 列应存储在
中以保留列顺序LinkedHashMap
- 不要捕获异常并继续。允许它级联到调用方
public List<Map<String, String>> getData(final String query) throws SQLException {
final List<Map<String, String>> results = new ArrayList<>();
try (Statement stmt = this.conn.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
ResultSetMetaData metaData = rs.getMetaData();
while (rs.next()) {
Map<String, String> record = new LinkedHashMap<>();
for (int col = 1; col <= metaData.getColumnCount(); col++)
record.put(metaData.getColumnLabel(col), rs.getString(col));
results.add(record);
}
}
return results;
}
public static void printMap(List<Map<String, String>> rows) {
for (int rowNum = 0; rowNum < rows.size(); rowNum++)
System.out.println(rowNum + " = " + rows.get(rowNum));
}
公共列表getData(最终字符串查询)引发SQLException{
最终列表结果=新建ArrayList();
try(语句stmt=this.conn.createStatement();
结果集rs=stmt.executeQuery(查询)){
ResultSetMetaData元数据=rs.getMetaData();
while(rs.next()){
映射记录=新建LinkedHashMap();
对于(int col=1;col为什么使用Map而不是HashMap?最终条目也不会编译,将其更改为最终映射。条目修复了它:D@EllisonPatterson使用
Entry
unqualified将在导入时起作用。@EllisonPatterson在变量中使用Map
而不是HashMap
的原因是,您可以轻松地更改到另一个映射,e、 g.TreeMap
如果您想按名称对列进行排序,或者LinkedHashMap
如果您想保留查询的列顺序。啊,明白了!谢谢,现在我只需要将其分离出来,因为您打印的方式比我想象的更复杂!为什么要用Map而不是HashMap?最终条目也不会编译,将其更改为最终的Map。条目修复es it:D@EllisonPatterson使用Entry
unqualified将在导入时起作用。@EllisonPatterson在变量中使用Map
而不是HashMap
的原因是,您可以轻松地更改到另一个映射,例如,如果您希望按名称排序列,则使用TreeMap
,如果您想保留列顺序