6

您好,我刚开始使用 Java 中的 SQL(实际上不久前也开始使用 Java ......),我创建了一个类来连接 MySQL 数据库,并且一切正常。

现在我有一个关于获得结果的问题。

在PHP中我会做类似的事情

While($row = mysql_fetch_assoc()) {
  echo $row['rowname'];
}

在 Java 中,我尝试创建与此类似的东西,但我不知道我是否走对了路,或者它应该有很大的不同或其他什么......这是我所做的(参见 getResultList 方法)

public class MysqlConnect{

     private String query;
     private ResultSet rs;

    public void connectToAndQueryDatabase(String database, String username, String password) throws SQLException {

            Connection con = null;
            try {
                con = DriverManager.getConnection(
                                     "jdbc:mysql://localhost:3306/" + database,
                                     username,
                                     password);
            } catch (SQLException e) {
                e.printStackTrace();
            }

            Statement stmt = con.createStatement();
            rs = stmt.executeQuery(query);
    }

    public void setQuery(String query) {

        this.query = query;

    }

    public List getResultList() {
        ArrayList<HashMap> row = new ArrayList<HashMap>(); 
        while(row = rs.next()) {

        }

        return rs;
    }
}
4

7 回答 7

4
public void connectToAndQueryDatabase(String username, String password) {

    Connection con = DriverManager.getConnection(
                         "jdbc:myDriver:myDatabase",
                         username,
                         password);

    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

    while (rs.next()) {
        int x = rs.getInt("a");
        String s = rs.getString("b");
        float f = rs.getFloat("c");
    }
}

了解如何使用 JDBC 的最佳地点是 Oracle 网站上的JDBC 教程

要了解如何从结果集中检索值,请查看本教程的这一部分。

ResultSet 对象是表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

您可以通过游标访问 ResultSet 对象中的数据。请注意,此游标不是数据库游标。此游标是指向 ResultSet 中的一行数据的指针。最初,光标位于第一行之前。ResultSet.next 方法将光标移动到下一行。如果光标位于最后一行之后,则此方法返回 false。此方法使用 while 循环重复调用 ResultSet.next 方法,以遍历 ResultSet 中的所有数据。

ResultSet 接口声明用于从当前行检索列值的 getter 方法(例如,getBoolean 和 getLong)。您可以使用列的索引号或列的别名或名称来检索值。列索引通常更有效。列从 1 开始编号。为了获得最大的可移植性,每行中的结果集列应按从左到右的顺序读取,并且每列应仅读取一次。

于 2012-12-20T11:27:39.323 回答
3

试试下面的代码。使用所需的查询和凭据更改查询、url、用户、密码。

public static void main(String args[]) {

String url = "database url";
Connection con;
String query = "Your select query here";
Statement stmt;

try {
  Class.forName("Full driver class name");

} catch(java.lang.ClassNotFoundException e) {
  System.err.print("ClassNotFoundException: ");
  System.err.println(e.getMessage());
}

try {
  con = DriverManager.getConnection(url, 
               "user", "password");

  stmt = con.createStatement();              

  ResultSet rs = stmt.executeQuery(query);
  ResultSetMetaData rsmd = rs.getMetaData();
  int numberOfColumns = rsmd.getColumnCount();
  int rowCount = 1;
  while (rs.next()) {
    System.out.println("Row " + rowCount + ":  ");
    for (int i = 1; i <= numberOfColumns; i++) {
      System.out.print("   Column " + i + ":  ");
      System.out.println(rs.getString(i));
    }
    System.out.println("");
    rowCount++;
  }
  stmt.close();
  con.close();

} catch(SQLException ex) {
  System.err.print("SQLException: ");
  System.err.println(ex.getMessage());


 }  
  }

有关文档和 api,请访问以下 oracle 站点。

ResultSetMetaData 的文档和 api

于 2012-12-23T03:44:36.080 回答
3

ResultSetMetaData 是一个接口,它提供有关 ResultSet 的所有信息,例如生成的 ResultSet 的所有列名称、类型、长度等。

只需使用该界面即可。有关 API 的更多信息和文档,请访问 Oracle 网站。

于 2012-12-21T16:12:59.593 回答
2

处理数据库 Java 提供了 java.sql.* 包。您需要阅读此 API 的 java 文档并了解它们的用法。只有了解 java.sql.* 包的用法,才能根据业务需求应用最佳逻辑和技巧。

我建议你先浏览一下 oracle 文档,如果你卡在某个地方,再去社区。

通过 ResultSetMetaData 接口。我想这个界面是回答你的问题。

http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSetMetaData.html

于 2012-12-26T14:58:01.247 回答
2

ResultSet中有很多方法可以处理它。

如果您需要遍历它,只需使用

rs.next();

如果您需要通过别名获取列:

rs.getString("alias");
rs.getFloat("other_alias");
// or by column index
rs.getString(3);

您还有一个实用程序类,用于提取有关结果集的信息,例如列数及其名称:

rs.getMetaData();

确保在完成后关闭连接。

于 2012-12-20T11:29:22.993 回答
2

只需将您的结果集传递到以下方法,它将返回您正在寻找的所需结果。

public List<Map<String, Object>> getResultsList(ResultSet rs) throws SQLException
{
    ResultSetMetaData metadata = rs.getMetaData();
    int columns = metadata.getColumnCount();

    List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
    while (rs.next())
    {
        Map<String, Object> row = new HashMap<String, Object>(columns);
        for (int i = 1; i <= columns; ++i)
        {
            row.put(metadata.getColumnName(i), rs.getObject(i));
        }
        results.add(row);
    }

    return results;
}
于 2012-12-20T11:40:57.590 回答
2

在您的 while 循环中,您使用了赋值运算符。rs.next() 返回真或假

 while(row=rs.next()) 
{}

你可以简单地说,

while(rs.next()) 
{}
于 2012-12-20T11:22:59.737 回答