[英]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.