Java - 解析从数据库返回的数据的麻烦

时间:2011-03-10 19:05:19

标签: java mysql database jdbc

我有一个动态的查询字符串。我在数据库中搜索的项目基于用户在html表单的复选框中选择的内容。用户类型从下拉列表中选择城市名称。然后,用户可以从城市中选择3个不同的属性:CountryCode(int),District(String)和Population(int)。

创建查询没问题。例如,如果用户选择Tulsa并选择区域和人口,则创建queryString SELECT District, Population FROM City WHERE name ='Tulsa'没有问题。再举一个例子,如果用户只选择了Tulsa的国家代码,则创建的查询字符串将为SELECT CountryCode FROM City WHERE name ='Tulsa'

问题是解析数据并将其整齐地显示在屏幕上。我不是数据库程序员,所以我很难过。这是我的代码的一小部分,所以你可以看到我在做什么。

我唯一能做的就是用户选择区和人口。任何其他选择都不起作用。我基本上很难编码区和人口。我不确定如何动态解析它。这是代码。查询字符串为SELECT District, Population FROM City WHERE name ='Tulsa'。它是我唯一可以上班的人。

public String getData( String c)
    {

        String query = c;
        ResultSet rs = null;
                StringBuffer back = new StringBuffer();

        try
        {
            rs = st.executeQuery(c);
            ResultSetMetaData rsmd = rs.getMetaData();

            int numColumns = rsmd.getColumnCount();
            back.append( "number of columns is " + numColumns);
                        back.append( "</br>");

            back.append( "<table border=\"10\" >\n" );
                        while(rs.next())
                        {
                            if(rsmd.getColumnTypeName(1).equals("CHAR"))
                                back.append("<tr><td>" + rsmd.getColumnName(1) + "</td>" + "<td>" + rs.getString(1) + "</trd</tr>");

                            if(rsmd.getColumnTypeName(2).equals("INT"))
                                back.append("<tr><td>" + rsmd.getColumnName(2) + "</td>" + "<td>" + Integer.toString(rs.getInt(2)) + "</td></tr>");

            }
            back.append( "</table>" );
        }
        catch( SQLException e )
        {
            back.append( "<h6>something bad is happening</h6>");
            e.printStackTrace();
            return null;
        }
        return new String( back );
    }

我希望你们明白我在问什么。非常感谢你的帮助!

5 个答案:

答案 0 :(得分:3)

如果您只想输出数据,那么您可以使用String获取所有内容ResultSet.getString(index),因为您知道元数据中的列数。

while(rs.next())
{
    for (int i = 1; i <= numColumns; i++)
    {
        back.append("<tr><td>" + rsmd.getColumnName(i) +
                    "</td>" + "<td>" + rs.getString(i) + "</trd</tr>");
    }
}

答案 1 :(得分:1)

数据库编程可以使用改进来实现更加现代化。

数据库编程的典型设计至少应该有一组实体类。实体类所做的是表示数据库中的表。因此,您将为表中的每列创建适当数据类型的私有字段。您可以根据自己的需要充实它,但它可以根据您的数据库设计为您的应用程序提供结构。

然后,您可以编写基本数据库函数

public City getCity(Object primaryKey){

     ... <run select query on the primary key and get result set> ...

     Entity ent = new Entity();
     ent.setDistrict( rs.getString( 0 ) );
     ent.setPopulation ( rs.getInt( 1 ) );
     ...

     return ent;
 }

典型的情况下,您可以将其他基本功能(如createCity(城市)deleteCity(城市)更新城市(城市)全部放入一个可以作为数据访问对象或DAO的类中,因此这可能是您的CityDAO。

然后在您显示的类文件中,您可以简单地调用getCity函数并确定需要从City对象中获取哪些字段。您将对City对象的字段进行强类型检查,这对于HTML格式化应该很好。

答案 2 :(得分:0)

如果是

SELECT CountryCode FROM City WHERE name ='Tulsa'

您在ResultSet中只有一列,但稍后在您的代码中,您将从索引为2的列中获取数据

rs.getInt(2)

你的主要问题有很多解决方案,从Spring JdbcTemplate开始到像Hibernate一样的ORM ......

答案 3 :(得分:0)

while(rs.next())  { 
  int numColumns = rs.getMetadata().getColumnCount();
  for (int i = 0; i < numColumns; ++i) {
    back.append("<tr><td>" + rsmd.getColumnName(i) + "</td>" + "<td>" + rs.getString(i) + "</td></tr>");
  }
} 

答案 4 :(得分:0)

要为现有答案添加新内容,以下是我将如何编写代码的代码。一些说明:

  • 第一种方法(getDataInternal)仅涉及SQL查询,而不涉及错误处理。但是,如果出现错误,ResultSet已正确清理。
  • 第二种方法(getData)包含所有内容,提供简单的错误处理。
  • 无论是否发生异常,每个方法都会释放它所获得的资源。

通过这种分离,代码变得更容易阅读和维护。

package so5264507;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.commons.lang.StringEscapeUtils;

public class DatabaseDemo {

  public String getDataInternal(Statement st, String c) throws SQLException {
    ResultSet rs = st.executeQuery(c);
    try {
      ResultSetMetaData meta = rs.getMetaData();
      StringBuilder sb = new StringBuilder();
      while (rs.next()) {
        sb.append("<table border=\"10\">\n");
        for (int i = 1; i < meta.getColumnCount() + 1; i++) {
          sb.append("<tr>");
          sb.append("<td>" + StringEscapeUtils.escapeHtml(meta.getColumnName(i)) + "</td>");
          sb.append("<td>" + StringEscapeUtils.escapeHtml(rs.getString(i)) + "</td>");
          sb.append("</tr>\n");
        }
        sb.append("</table>\n\n");
      }
      return sb.toString();
    } finally {
      rs.close();
    }
  }

  public String getDataAsHtml(Statement st, String c) {
    try {
      return getDataInternal(st, c);
    } catch (SQLException e) {
      e.printStackTrace();
      return "<h6>Something bad happened.</h6>";
    }
  }

  public void run() throws SQLException {
    DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sodemo", "sodemo", "sodemo");
    try {
      Statement st = conn.createStatement();
      try {
        String html = getDataAsHtml(st, "SELECT District, Population FROM City");
        System.out.println(html);
      } finally {
        st.close();
      }
    } finally {
      conn.close();
    }
  }


  public static void main(String[] args) throws SQLException {
    new DatabaseDemo().run();
  }
}