我有一个动态的查询字符串。我在数据库中搜索的项目基于用户在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 );
}
我希望你们明白我在问什么。非常感谢你的帮助!
答案 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();
}
}