簡體   English   中英

Java-無法解析從數據庫返回的數據

[英]Java - Trouble Parsing Data Returned From Database

我有一個動態的查詢字符串。 我在數據庫中搜索的項目基於用戶在html表單的復選框中選擇的內容。 用戶類型從下拉列表中選擇城市名稱。 然后,用戶可以從3個不同的城市屬性中進行選擇:CountryCode(int),District(String)和Population(int)。

我沒有問題創建查詢。 例如,如果用戶選擇塔爾薩(Tulsa)並選擇地區和人口SELECT District, Population FROM City WHERE name ='Tulsa'則不會創建SELECT District, Population FROM City WHERE name ='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 );
    }

我希望你們能理解我的要求。 非常感謝您的幫助!

如果您要做的只是輸出數據,那么您就可以使用ResultSet.getString(index)將所有內容作為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>");
    }
}

數據庫編程可以使用改進使其更加現代化。

數據庫編程的典型設計是至少具有一組Entity類。 實體類的作用是代表數據庫中的表。 因此,您將為表中的每一列創建具有正確數據類型的私有字段。 您可以按自己的意願充實它,但是它可以根據數據庫設計為應用程序提供結構。

然后,您可以編寫基本的數據庫功能

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(City city)deleteCity(City city)updateCity(City city))全部放入一個單獨的類中,該類可以是Data Access Object或DAO,因此可以是CityDAO。

然后,在顯示的類文件中,只需調用getCity函數並找出需要從City對象獲取的字段。 您還將在City對象的字段上進行強類型檢查,這對於HTML格式設置應該是不錯的選擇。

的情況下

SELECT CountryCode FROM City WHERE name ='Tulsa'

您在ResultSet中只有一列,但是稍后在代碼中,您從索引為2的列中獲取數據

rs.getInt(2)

您的主要問題有很多解決方案,從Spring JdbcTemplate到Hibernate之類的ORM ...

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>");
  }
} 

要為現有答案添加一些新內容,以下是我編寫代碼的方式。 一些注意事項:

  • 第一種方法( 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();
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM