Что означает "Class.forName (" org.sqlite.JDBC "); делать? - PullRequest
24 голосов
/ 19 июля 2011

Я пытаюсь создать простое приложение с базой данных SQLite.Я решил использовать драйвер SQLiteJDBC .

Код ниже взят с вышеуказанного сайта.Мой вопрос касается строки после public static void main ...

Она гласит: Class.forName("org.sqlite.JDBC");

Мой вопрос: что означает эта строка?И что это делает?Кажется, он не связан с остальной частью кода.Class.forName() должен возвращать класс, но строка внутри тела кажется одинокой.То, что он возвращает, не используется другой частью кода, что я вижу.

Пожалуйста, помогите прояснить это.Заранее спасибо.

public class Test {
 public static void main(String[] args) throws Exception {
    Class.forName("org.sqlite.JDBC");
    Connection conn =
      DriverManager.getConnection("jdbc:sqlite:test.db");
    Statement stat = conn.createStatement();
    stat.executeUpdate("drop table if exists people;");
    stat.executeUpdate("create table people (name, occupation);");
    PreparedStatement prep = conn.prepareStatement(
      "insert into people values (?, ?);");

prep.setString(1, "Gandhi");
prep.setString(2, "politics");
prep.addBatch();
prep.setString(1, "Turing");
prep.setString(2, "computers");
prep.addBatch();

conn.setAutoCommit(false);
prep.executeBatch();
conn.setAutoCommit(true);

ResultSet rs = stat.executeQuery("select * from people;");
while (rs.next()) {
  System.out.println("name = " + rs.getString("name"));
  System.out.println("job = " + rs.getString("occupation"));
}
rs.close();
conn.close();
}
  }

Ответы [ 2 ]

26 голосов
/ 19 июля 2011

Динамически загружает класс. Что делает метод Class.forname? - хорошая статья об этом, и в нем также объясняется, почему драйверы базы данных нуждаются в этом:

Давайте посмотрим, зачем вам нужен Class.forName () длязагрузить драйвер в память.Все драйверы JDBC имеют статический блок, который регистрируется в DriverManager, а DriverManager имеет только статический инициализатор.

Драйвер JDBC MySQL со статическим инициализатором выглядит следующим образом:

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

JVM выполняет статический блок, и драйвер регистрируется в DriverManager.

Для работы с базой данных требуется соединение с базой данных.Чтобы создать соединение с базой данных, класс DriverManager должен знать, какой драйвер базы данных вы хотите использовать.Это делается путем перебора массива (внутренне Vector) драйверов, которые были зарегистрированы в нем, и вызова метода acceptsURL (url) для каждого драйвера в массиве, фактически запрашивая драйвер, чтобы сказать ему, может ли он обрабатывать JDBCURL.

1 голос
/ 19 июля 2011

Оператор Class.forName гарантирует, что класс, реализующий драйвер JDBC для sqlite3, загружен и зарегистрирован с помощью механизма фабрики JDBC.

При вызове DriverManager.getConnection () он ищет классыкоторые зарегистрированы и утверждают, что могут обрабатывать строку подключения.Если такой класс не найден, он не может создать соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...