2013-04-18 2 views
1

JSP/서블릿 용 NetBeans 7.0.1 IDE를 사용하고 있습니다. 프로젝트에 대한 데이터베이스 연결을 시도하고 있습니다. 이미 jar 파일 인 'mysql-connector-java-5.1.24-bin.jar'을 jdk의 jre/lib 디렉토리에 붙여 넣었고 netbean 프로젝트 라이브러리 디렉토리에도 추가했습니다. 는 내가 서블릿을 생성하고 다음 코드 작성 :JSP로 netbeans가있는 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

당신이 걸린 예외 stacktrace를 게시하십시오 –

+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); 
} 

: 당신이 드라이버를 사용하기 전에

은, 그것은 JDBC DriverManager에 등록되어 있어야합니다. 이것은 일반적으로 Class.forName을() 메소드를 사용하여 드라이버 클래스 로드하여 수행됩니다

당신은 내가 다른를 사용하여로드되었다고 가정하고있어 JDK/lib 폴더 내에 라이브러리를 배치했기 때문에이 필요합니다

응용 프로그램에서 사용하는 것보다 ClassLoader. 다른 클래스 로더가 사용 되었기 때문에 JDBC 4.0 이상의 드라이버에서 자동 등록이 적용되지 않습니다. 당신은 당신의 어플리케이션의 동일한 ClassLoader를 사용해야하는 어플리케이션 서버의 lib 내에 driver jar 파일을 위치 시키려고 할 수 있습니다. 참조 : 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 (Service Provider Mechanism)을 지원하도록 으로 향상되었습니다. SPM에 따르면 서비스는 잘 알려진 인터페이스 및 추상 클래스 집합으로 정의되며 서비스 공급자는 특정 서비스 구현입니다. 또한 서비스 공급자 구성 파일이 META-INF/services 디렉터리에 저장되도록 지정합니다. JDBC 4.0 드라이버는 META-INF/services/java.sql.Driver 파일을 포함해야합니다. 이 파일에는 JDBC 드라이버의 java.sql.Driver 구현의 이름이 들어 있습니다.

org.apache.derby.jdbc : 예를 들어, Apache Derby 데이터베이스에 연결하는 JDBC 드라이버를로드하려면 META-INF/서비스/java.sql.Driver 파일에는 다음 항목이 포함됩니다. EmbeddedDriver

이 새로운 기능을 사용하여 JDBC 드라이버 관리자를로드하는 방법에 대해 간단히 살펴 보겠습니다.다음 목록은 이 일반적으로 JDBC 드라이버를로드하는 데 사용하는 샘플 코드입니다.

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 커넥터를 라이브러리에 추가 한 이유는 왜 이것을 사용해야할까요? 혼란 스럽군요 :-( –

+0

@ShaonHasan 클래스를로드하는 데 사용됩니다. JDBC 드라이버에는 생성자와 비슷하지만 객체가 아닌 클래스에 대한 정적 초기화 도구가 있습니다.이 드라이버 내부에는 DriverManager에 등록되므로 이 클래스를 사용하여 연결과 같은 리소스를 얻을 수 있습니다. 클래스가로드 될 때 이니셜 라이저가 실행됩니다 .class.forName이이 프로세스를 시작합니다. java 파일에 import 문을 추가 할 수도 있습니다. import com.mysql.jdbc.Driver '또는 빌드 경로에 대한 환경 변수에 동일한 것을 추가하십시오. –

+0

@AjoKoshy 다른 클래스 로더가 여기에 올 것입니까? –

0

단지에서 "MySQL의 커넥터 - 자바를"유지 "C : \ 프로그램 파일 \ 자바 \ jdk1.7.0_25 \ JRE \ lib 디렉토리 \ 내선" 은 "jdk1.7.0_25" jdk의 나의 버전은 당신이 다른 버전일지도 모르지만 그 안에 "\ jre \ lib \ ext"하위 폴더가 있어야합니다.