2014-11-07 3 views
3

Я изучал JDBC, только я не получаю класс Class в следующем коде.Что означает Class.forName()

Удаляю ли я Class.forName("com.mysql.jdbc.Driver") или нет, он работает правильно.

Не могли бы вы объяснить, какая функция Class.forName ("com.mysql.jdbc.Driver") в этой части?

import java.sql.*; 
public class JSP { 

    public static void main(String[] args){ 
     Connection myConn = null; 
     Statement st= null; 
     ResultSet rs= null; 

     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/customer", "root", "Gspot"); 

      st = myConn.createStatement(); 
      String query = "select * from customers"; 

      rs = st.executeQuery(query); 
      while(rs.next()){ 
       System.out.println(rs.getString("name")); 
      } 
     } catch(SQLException e){ 
      e.printStackTrace(); 
     } catch(ClassNotFoundException e) { 
      System.out.println("wow"); 
     } 
    } 
} 
+0

http://www.xyzws.com/javafaq/what-does-classforname-method-do/17 –

+0

JDBC 4 не нуждается в этом трюке для работы, он использует службу в манифесте для поиска этих классов, поэтому вам это не нужно. –

ответ

4

Class.forName("com.mysql.jdbc.Driver") получит объект класса для названного класса через отражение.

Если этот класс существует, нет никакой разницы между наличием этой строки в коде или нет, вы ничего не делаете с возвращаемым значением. Однако, если он не существует на пути к классам, вы получите исключение из этого вызова, и, следовательно, вы знаете, что драйвер отсутствует, а не просто соединение.

Предположим, что драйвер MySQL отсутствует в пути к классам.

Без этого оператора может возникнуть ошибка, например, «невозможно открыть соединение», и вам может понадобиться проанализировать журналы и искать причину.

Если вызывается оператор, вы получите ClassNotFoundException и, следовательно, вы узнаете причину проблем: классы драйверов не найдены загрузчиком классов.

Редактировать: чтение @ Ответ Мурейника, это, вероятно, лучшая причина для этого утверждения. :)

9

Class.forName создает экземпляр java.lang.Class, соответствующий данному имени. Это заставляет загрузчик классов загружать этот класс и выполнять любой код в его блоках static.

Старшие драйверы JDBC использовали этот статический блок для регистрации на java.sql.DriverManager, чтобы впоследствии их можно было использовать для подключения к базе данных. JDBC 4, который был частью Java 6, представил механизм автоматической загрузки драйверов JDBC, поэтому это больше не нужно.

0

Согласно документации (http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName(java.lang.String)):

Вызов forName ("X") вызывает класс с именем X для инициализации.

, что означает, что класс загружается с диска и его статические инициализаторы называются, такие как:

public class Test { 
    private static final int a;  
    static { // called when the class is loaded via forName or any other loading mechanism 
     a = 5; 
     doSomething(a); 
    } 
    private static int doSomething(int x) { 
     return (x+5); 
    } 
} 

Это происходит только один раз, когда загружается класс. Например, в вашем случае мы можем предположить, что он позволяет водителю запускать код для регистрации в JDBC.

Если этот вызов для вас не изменяет поведение во время выполнения, это означает, что класс уже был загружен раньше.

1

Я рекомендую вам прочитать эту статью: Understanding-ClassforName-Java

Если вы звоните Class.forName("com.mysql.jdbc.Driver"); драйвер класса com.mysql.jdbc.Driver будет загружен в память.Каждые такие классы драйвера имеют статический блок, как это:

static { 
    try { 
     java.sql.DriverManager.registerDriver(new Driver()); 
    } catch (SQLException E) { 
     throw new RuntimeException("Can't register driver!"); 
    } 
} 

Так что, если вы загружаете класс, статический блок будет вызываться автоматически драйвер будет (если успех) зарегистрирован.

Смежные вопросы