2014-11-21 54 views
2

我正在使用eclipse和tomcat7。我確實導入了mysql jar文件,它位於tomcat文件夾內。JAVA中的Mysql連接失敗

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mydb 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at connectionDb.openConnection(connectionDb.java:27) 
    at connectionDb.getConnection(connectionDb.java:37) 
    at DbManager.<clinit>(DbManager.java:7) 
    at registrationServlet.doPost(registrationServlet.java:64) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Connection Opened 
java.lang.NullPointerException 

我的代碼:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public class connectionDb { 

    private static connectionDb instance = null; 

    private final String USERNAME = "root"; 
    private final String PASSWORD = "mypass"; 
    private final String CONN_STRING = "jdbc:mysql://localhost:3306/mydb"; 

    private Connection conn = null; 

    private connectionDb() { 
    } 

    public static connectionDb getInstance() { 
     if (instance == null) { 
      instance = new connectionDb(); 
     } 
     return instance; 
    } 

    private boolean openConnection() { 
     try { 
      conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return true; 
    } 

    public Connection getConnection() { 
     if (conn == null) { 
      if (openConnection()) { 
       System.out.println("Connection Opened"); 
       return conn; 
      } else { 
       return null; 
      } 
     } 
     return conn; 
    } 
    public void close(){ 
     System.out.println("Close connection"); 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     conn=null; 
    } 
} 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 

public class DbManager { 

    private static Connection conn = connectionDb.getInstance().getConnection(); 

    public static void Insert(getset set) throws ClassNotFoundException , SQLException { 
     String driver = "com.mysql.jdbc.Driver"; 
     try { 
      Class.forName(driver).newInstance(); 

      // insert username and password 
      String sql = "INSERT INTO lonininfo(username, password) VALUES (?,?)"; 
      PreparedStatement pstmt = conn.prepareStatement(sql); 
      pstmt.setString(1, set.getUserName()); 
      pstmt.setString(2, set.getPassword()); 
      pstmt.executeUpdate(); 
      // insert user info 
      String sql1 = "INSERT INTO userinfo(fullName, email, dateOfBirth, phoneNumber, companyName, companyEmail, paymentMethod) VALUES (?,?,?,?,?,?,?)"; 
      PreparedStatement pstmt1 = conn.prepareStatement(sql1); 
      pstmt1.setString(1, set.getFullName()); 
      pstmt1.setString(2, set.getEmail()); 
      pstmt1.setString(3, set.getDateOfBirth()); 
      pstmt1.setString(4, set.getPhoneNumber()); 
      pstmt1.setString(5, set.getCompanyName()); 
      pstmt1.setString(6, set.getCompanyEmail()); 
      pstmt1.setString(7, set.getPaymentMethod()); 
      pstmt1.executeUpdate(); 
      connectionDb.getInstance().close(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } finally { 
      if (conn != null) { 
       try { 
        conn.close(); 
       } catch (SQLException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+0

你在哪裏放置MySQL驅動罐子? – 2014-11-21 10:46:50

回答

3

大概的openConnection()被調用Class.forName(...)前稱爲是 當我想我的頁面上註冊我得到的錯誤曾經執行過。我試着將這個調用移到openConnection()方法而不是Insert()方法。

2

必須首先加載驅動程序類,然後再建立JDBC連接。在openConnection方法裏面移動Class.forName就好了,它應該工作。確保mysql驅動程序jar在類路徑中。

private boolean openConnection() { 
     try { 
      String driver = "com.mysql.jdbc.Driver"; 
      Class.forName(driver).newInstance(); 
      conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return true; 
    } 
1

從錯誤堆棧跟蹤它看起來像你第一次調用的openConnection方法。並且您的Class.forName(驅動程序)調用在插入方法。因此,在加載課程之前,您正嘗試打開連接。 因此,請移動Class.forName(驅動程序)並將其放在您可以調用之前openConnection。在插入或任何數據庫操作調用之前,您也不需要每次調用Class.forName(驅動程序)

2

試試這個

public class DbManager { 

private static Connection conn; 

public static void Insert(getset set) throws ClassNotFoundException , SQLException { 
    String driver = "com.mysql.jdbc.Driver"; 
    try { 
     Class.forName(driver).newInstance(); 
     conn = connectionDb.getInstance().getConnection(); 
     // insert username and password 
     String sql = "INSERT INTO lonininfo(username, password) VALUES (?,?)"; 
     PreparedStatement pstmt = conn.prepareStatement(sql); 
     pstmt.setString(1, set.getUserName()); 
     pstmt.setString(2, set.getPassword()); 
     pstmt.executeUpdate(); 
     // insert user info 
     String sql1 = "INSERT INTO userinfo(fullName, email, dateOfBirth, phoneNumber, companyName, companyEmail, paymentMethod) VALUES (?,?,?,?,?,?,?)"; 
     PreparedStatement pstmt1 = conn.prepareStatement(sql1); 
     pstmt1.setString(1, set.getFullName()); 
     pstmt1.setString(2, set.getEmail()); 
     pstmt1.setString(3, set.getDateOfBirth()); 
     pstmt1.setString(4, set.getPhoneNumber()); 
     pstmt1.setString(5, set.getCompanyName()); 
     pstmt1.setString(6, set.getCompanyEmail()); 
     pstmt1.setString(7, set.getPaymentMethod()); 
     pstmt1.executeUpdate(); 
     connectionDb.getInstance().close(); 
    } catch (Exception e) { 
     System.out.println(e); 
    } finally { 
     if (conn != null) { 
      try { 
       conn.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

}