2014-12-20 63 views
0

我一直在嘗試創建一個使用Velocity的HTML頁面,它顯示了存儲在名爲users的SQL表中的名稱。當我運行我的程序,它打印以下堆棧跟蹤:速度與MySQL DB連接不起作用

java.sql.SQLException 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) 
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815) 
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5528) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5448) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5488) 
    at com.sarvika.velocity.HelloWorld.CfNMHTMLParser.main(CfNMHTMLParser.java:41) 

我相信,我沒有導入所有需要的庫,併爲MySQL連接驅動程序。我正在使用mysql-connector-java-5.1.6。我的代碼是:

package com.sarvika.velocity.dbtovelocity; 

import java.io.*; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

import org.apache.velocity.*; 
import org.apache.velocity.app.VelocityEngine; 

public class CfNMHTMLParser { 

private final static String URL = "jdbc:mysql://localhost/coffeenet"; 
private final static String USER = "root"; 
private final static String PASS = "root"; 

private static final String BOOL_EXC = "exception"; 
private static final String EXC = "exc"; 
private static final String USER_LIST = "usersArray"; 

    public static void main (String [] args) 
      throws IOException { 

     VelocityEngine engine = new VelocityEngine(); 
     Template template = engine.getTemplate("HTMLTemplate.vm"); 
     VelocityContext context = new VelocityContext(); 

     CfNMHTMLParser parser = new CfNMHTMLParser(); 

     String [] data = null ; 
     try { 

      Connection conn = DriverManager.getConnection(URL, USER, PASS); 
      Statement stmt = conn.createStatement(); 

      String query = "SELECT count(*) FROM users ;"; 
      ResultSet rs = stmt.executeQuery(query); 

      int count = Integer.parseInt(rs.getString("count(*)")); 

      data = new String[count]; 

      query = "SELECT AuthID FROM users ;"; 
      rs = stmt.executeQuery(query); 

      for (int i = 0 ; i < count ; i++) { 
       rs.next(); 
       data[i] = rs.getString("AuthID"); 
      } 

    //   data = new String [] { 
    //     "developers", 
    //     "developers", 
    //     "developers", 
    //     "developers" 
    //   }; 

     } catch (SQLException ex) { 

      ex.printStackTrace(); 
      context.put(BOOL_EXC, true); 
      context.put(EXC, ex.getMessage()); 

     } 

     context.put(USER_LIST, data); 

     StringWriter templateData = new StringWriter(); 
     template.merge(context, templateData); 

     File htmlFile = new File("page.html"); 
     FileWriter fileWriter = new FileWriter(htmlFile); 
     BufferedWriter writer = new BufferedWriter(fileWriter); 
     writer.write(templateData.toString()); 

     writer.close(); 

    } 

} 

文件HTMLTemplate.vm

#macro(makeUserTable $userListObjArray) 
    #foreach($user in $userListObjArray) 
     <font size="7" color="ffccaa"> 
      $user 
     </font> 
     <BR> 
    #end 
#end 

<html> 

    <title>CoffeeNet Messenger Users</title> 

    #if ($exception == true) 
     <font size="48">Exception : $exc </font> 
    #else 
     #makeUserTable($usersArray) 
    #end 

</html> 

請告訴我在哪裏,我在做的錯誤...

回答

0

我發現了什麼問題。這是不是因爲

String query = "SELECT count(*) FROM users ;";  

    ResultSet rs = stmt.executeQuery(query); 

    int count = Integer.parseInt(rs.getString("count(*)")); 

這裏,堆棧跟蹤說什麼

at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815) 

它告訴我們檢查該行的位置,在這種情況下是什麼。 正確的代碼,然後是

String query = "SELECT count(*) FROM users ;"; 

    rs.next();  

    ResultSet rs = stmt.executeQuery(query); 

    int count = Integer.parseInt(rs.getString("count(*)")); 

使用列別名就是什麼。

1

的錯誤是在這一行rs.getString(」 COUNT(*)「),這樣你就可以改變這個兩行:分別

String query = "SELECT count(*) FROM users ;"; 
...    
int count = Integer.parseInt(rs.getString("count(*)")); 

String query = "SELECT count(*) as tot FROM users ;"; 
...    
int count = Integer.parseInt(rs.getString("tot")); 

對於速度,我認爲你必須初始化是這樣你就可以加入這一行:

VelocityEngine engine = new VelocityEngine(); 
    engine.init(); // line to add 
    Template template = engine.getTemplate("HTMLTemplate.vm"); 
+0

沒有人。你錯了 –