2011-07-18 4 views
24

私はSQLiteデータベースを使って簡単なアプリケーションを作成しようとしています。私はSQLiteJDBC driverを使いました。'Class.forName( "org.sqlite.JDBC");'行う?

以下のコードは上記のウェブサイトから取得したものです。 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(); 
} 
    } 
+0

http://stackoverflow.com/a/8053125/632951 – Pacerier

答えて

26

クラスを動的にロードします。 What does Class.forname method do?はそれについての良い記事で、それはまた、データベースドライバがそれを必要とする理由を説明する:

は、あなたがメモリにドライバをロードするために()Class.forNameのを必要とする理由を見てみましょう。すべてのJDBCドライバには、DriverManagerに自身を登録する静的ブロックがあり、DriverManagerにはスタティックイニシャライザのみがあります。

MySQLのJDBCドライバは、静的初期化子は、次のようになりますがあります。

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

JVMは、静的なブロックを実行し、ドライバのDriverManagerに自身を登録します。

データベースを操作するには、データベース接続が必要です。データベースへの接続を作成するには、DriverManagerクラスで、使用するデータベースドライバを知っている必要があります。これは、配列に登録されているドライバの配列(内部的にはVector)を繰り返し処理し、配列の各ドライバでacceptsURL(url)メソッドを呼び出し、JDBCを処理できるかどうかをドライバーに効果的に伝えますURL。

+5

を参照してください。 Class.forName(...)メカニズムがもはや優先されないことに注目することも重要です。 "Modernized" JDBCドライバは、[DriverManagerが検索する] jarの "META-INF/java.sql.Driver"にファイルを持っています(http://download.oracle.com/javase/6/docs/api/java/ sql/DriverManager.html)を使用してドライバの実装を自動検出します。残念ながら、SQLLiteにはこのファイルがありません。 –

+1

Xerial SQLiteドライバのメーリングリストで、 'META-INF/services/java.sql.Driver'ファイルの追加に関する議論がありますが、プロジェクトのソースツリーにチェックインされたファイルは表示されません。 http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC – seh

1

Class.forNameステートメントは、sqlite3のJDBCドライバを実装するクラスがロードされ、JDBCファクトリメカニズムに登録されていることを確認しています。

DriverManager.getConnection()を呼び出すと、登録されているクラスが検索され、接続文字列を処理できると主張します。そのようなクラスが見つからなければ、接続を作成することはできません。

関連する問題