2013-04-18 43 views
1

我正在爲NetBeans 7.0.1 IDE使用JSP/Servlet 我試圖爲我的項目創建數據庫連接。已經下載的jar文件'mysql-connector-java-5.1.24-bin.jar'將其粘貼到jdk的jre/lib目錄中,並將其添加到我的netbean項目庫dir中。 然後我創建了一個servlet和寫了下面的代碼:使用NetBeans for jsp與mysql連接

import java.sql.*; 
import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


public class tstJDBC extends HttpServlet { 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    try{ 
    String dbURL = "jdbc:mysql://localhost:3306/murach"; 

     String username="root"; 
     String password="1234"; 

     Connection con2 = DriverManager.getConnection(dbURL, username, password); 
      String query = "insert into tblUser1(firstname) values('shaon')"; 

      Statement statmnt = con2.createStatement(); 
      statmnt.executeUpdate(query); 
    } 

    catch(SQLException e) 
    { 
     e.printStackTrace(); 
    } 
} 

}

但它可以建立連接。從連接con2行,它直接catch()塊;而不執行查詢。

+0

請發佈您捕獲的異常堆棧跟蹤 –

+0

您在獲取連接之前缺少'Class.forName(「com.mysql.jdbc.Driver」);'' –

回答

0

嘗試在使用DriverManager類之前加載驅動程序。

try{ 
    String dbURL = "jdbc:mysql://localhost:3306/murach"; 

    String username="root"; 
    String password="1234"; 


    Class.forName("com.mysql.jdbc.Driver");//load driver 

    Connection con2 = DriverManager.getConnection(dbURL, username, password); 
    String query = "insert into tblUser1(firstname) values('shaon')"; 

    Statement statmnt = con2.createStatement(); 
    statmnt.executeUpdate(query); 
} 

由O'Reilly:

之前,你可以使用驅動程序,它必須與JDBC 的DriverManager註冊。這通常是通過使用Class.forName()方法加載的驅動程序類 完成:

這是必需的,因爲你已經把它我假設使用不同的加載JDK/lib文件夾中的庫ClassLoader比你的應用程序使用的類。由於使用了不同的類加載器,所以JDBC 4.0+驅動程序發生的自動註冊將不會生效。您可以嘗試將驅動程序jar文件放置在應用程序服務器的lib中,該應用程序服務器應該使用應用程序的相同ClassLoader。請參閱:When is Class.forName needed when connecting to a database via JDBC in a web app?

關於自動註冊

在JDBC 4.0,我們不再需要顯式地加載使用 的Class.forName JDBC驅動程序()。調用方法getConnection時,DriverManager將嘗試從初始化時加載的 JDBC驅動程序中找到合適的驅動程序,並顯式使用與當前應用程序相同的類加載程序加載 。

已增強DriverManager方法getConnection和getDrivers以支持Java SE服務提供者機制(SPM),其中增強了 。 根據SPM,服務被定義爲着名的一組接口和抽象類,而服務提供者是特定的 服務的實現。它還指定服務提供商配置文件 存儲在META-INF/services 目錄中。 JDBC 4.0驅動程序必須包含文件 META-INF/services/java.sql.Driver。該文件包含 JDBC驅動程序的java.sql.Driver實現的名稱。例如,要加載 JDBC驅動程序連接到Apache Derby數據庫,該 META-INF /服務/ java.sql.Driver文件需要包含以下 項:

org.apache.derby.jdbc。嵌入式驅動程序

我們快速瀏覽一下如何使用此新功能加載 JDBC驅動程序管理器。以下清單顯示了我們通常用於加載JDBC驅動程序的示例代碼。讓我們假設我們需要 連接到Apache Derby數據庫,因爲我們將使用這 示例應用程序在本文後面介紹:

Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
Connection conn = 
    DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword); 

但是在JDBC 4.0中,我們不需要類.forName()行。我們可以簡單地使用 調用getConnection()來獲取數據庫連接。

Source

關於服務裝載機

對於裝載的目的,一個服務是由一個單一的 類型表示,即,單個接口或抽象類。 (可以使用具體類 ,但不建議這樣做。)給定的 服務的提供者包含一個或多個具體類,這些類將服務 類型擴展爲特定於提供者的數據和代碼。提供者類別 通常不是整個提供者本身,而是代理 包含足夠的信息來決定提供者是否能夠 滿足特定請求以及可以根據需要創建實際提供者的代碼。提供者類的細節往往是高度服務特定的 ;沒有一個類或接口可能將它們統一起來,所以這裏沒有定義這種類型。 這個工具強制執行的唯一要求是提供程序類必須具有一個 零參數構造函數,以便在加載 期間可以對它們進行實例化。

通過在資源目錄META-INF/services中放置提供者配置文件 來標識服務提供者。該文件的名稱是 服務類型的完全限定二進制名稱。文件 包含具體提供商 類的完全限定二進制名稱列表,每行一個。圍繞每個名稱的空格和製表符, 以及空白行都將被忽略。註釋字符是'#' ('\ u0023',NUMBER SIGN);在每行上,忽略 第一個註釋字符後面的所有字符。該文件必須以 UTF-8編碼。

如果一個特定的具體提供者類在多個 配置文件中命名,或者在相同的配置文件中命名爲 以上,則會忽略重複項。命名特定供應商的配置文件 不需要與供應商本身在同一個jar文件或其他 分發單元中。提供程序必須是 ,可以從最初查詢到 的同一個類加載程序中訪問,以查找配置文件;請注意,這不一定是實際加載該文件的類加載器 。

Source

+0

但Class.forName(「com.mysql.jdbc.Driver」)用於手動加載驅動程序。如果我已經將mySQL JDBC連接器添加到庫中,而不是爲什麼我需要使用它? confused ..--( –

+0

@ShaonHasan它用於加載類,JDBC驅動程序有一個靜態初始化程序,它大致類似於構造函數,但是對於類而不是對象,在其內部,驅動程序向您的DriverManager註冊自己,所以你可以使用它來獲得像連接這樣的資源,初始化器在類被加載時運行,Class.forName只是啓動這個過程,你也可以將import語句添加到java文件中,如import com.mysql.jdbc.Driver '或將其添加到您的環境變量的構建路徑 –

+0

@AjoKoshy請問這裏有不同的類加載器嗎? –

0

只保留 「使用mysql-connector-java的」 在 「C:\ Program Files文件\的Java \ jdk1.7.0_25 \ JRE \ lib中\分機」 的 「jdk1.7.0_25」是我的版本的jdk可能是你有不同的版本,但必須有子文件夾「\ jre \ lib \ ext」裏面。