Что такое "Class.forName" ( "org.sqlite.JDBC" ); делать?
Я пытаюсь создать простое приложение с базой данных SQLite. Я решил использовать драйвер SQLiteJDBC.
Ниже приведен код, приведенный на вышеуказанном веб-сайте.
Мой вопрос о строке после общедоступного 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();
}
}
Ответы
Ответ 1
Он загружает класс динамически. Что делает метод 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 должен знать, какой драйвер базы данных вы хотите использовать. Он делает это путем итерации по массиву (внутренне вектор) драйверов, которые зарегистрировались у него, и вызывает метод acceptsURL (url) для каждого драйвера в массиве, фактически прося водителя сказать ему, может ли он обрабатывать JDBC URL.
Ответ 2
Оператор Class.forName гарантирует, что класс, реализующий драйвер JDBC для sqlite3, загружается и регистрируется механизмом JDBC factory.
Когда вы вызываете DriverManager.getConnection(), он ищет классы, которые зарегистрированы и утверждают, что могут обрабатывать строку подключения. Если такой класс не найден, он не может создать соединение.