Java - проблема с анализом данных, полученных из базы данных - PullRequest
0 голосов
/ 10 марта 2011

У меня есть строка запроса, которая является динамической.Элементы, которые я ищу в базе данных, основаны на том, что пользователь выбирает в флажке в HTML-форме.Пользователь выбирает название города из выпадающего списка.Затем пользователь может выбрать один из 3 атрибутов города: CountryCode (int), District (String) и Population (int).

У меня нет проблем при создании запроса.Например, если пользователь выбирает Талсу и выбирает Район и Население, то 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 ]

3 голосов
/ 10 марта 2011

Если все, что вы хотите сделать, это вывести данные, вы можете просто получить все как 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 голос
/ 10 марта 2011

Программирование базы данных может использовать улучшения, чтобы быть более модернизированным.

Типичным проектом для программирования баз данных было бы, по крайней мере, иметь набор классов 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 (город-город) deleteCity (город-город) updateCity (город-город), в один класс, который будет вашим объектом доступа к данным или DAO, так что это может быть ваш CityDAO.

Затем в файле класса, который вы показали, вы можете просто вызвать функцию getCity и выяснить, какие поля вам нужно получить из объекта City. У вас также будет строгая проверка типов на полях объекта City, что должно быть хорошо для форматирования HTML.

0 голосов
/ 10 марта 2011

Чтобы добавить что-то новое к существующим ответам, вот код, как я бы это написал. Некоторые заметки:

  • Первый метод (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();
  }
}
0 голосов
/ 10 марта 2011
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>");
  }
} 
0 голосов
/ 10 марта 2011

В случае

SELECT CountryCode FROM City WHERE name ='Tulsa'

у вас есть только один столбец в ResultSet, но позже в вашем коде вы получите данные из столбца с индексом 2

rs.getInt(2)

ваша основная проблема имеет многорешения, начиная от Spring JdbcTemplate до ORM, как Hibernate ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...