• ベストアンサー

Class.forName("org.postgresql.Driver")の意味

JDBCを使って、PostgreSQL を利用する場合、 まず最初に、Class.forName("org.postgresql.Driver")というのを使いますよね。 この、Class.forName(String str)メソッドは、str にある、クラスを初期化すると仕様書には書いてます。 (Class.forName("org.postgresql.Driver")).newInstance() を実行して、org.postgresql.Driver.class のコンストラクタを実行するというのなら、意味はわかるのですが、、、 ただClass.forName("org.postgresql.Driver")の命令だけを使ってなんの意味があるのでしょうか? 意味不明で困っています。どうか、よろしくお願い致します。

  • Java
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • Harry_
  • ベストアンサー率55% (36/65)
回答No.2

Driver の実装クラスは、 static 初期化子に、自身を DriverManager に 登録する、という処理が記述されています。 static 初期化子は、そのクラスが最初にロード された時に実行されます。クラスがロードされるとは そのクラスの Class オブジェクトが生成されることで (厳密にはイコールではないですが)、 Class.forName は そのクラスの Class オブジェクトを、 クラスが未ロードならロードした上で返すメソッドです。

その他の回答 (2)

回答No.3

他の回答者と同じ内容ですが、イメージが湧きにくいですよね。 org.postgresql.DriverのようなJDBCドライバのソースには 以下のようなコードがあるのだと思ってください。 public class FooDriver implements Driver { static { FooDriver driver = new FooDriver(); DriverManager.registerDriver(driver); } .... } Class.forName("FooDriver");のようにするとJVMがFooDriverを ロードしますが、その際にstatic {}の部分を実行します。 FooDriverのインスタンスを生成して、DriverManagerに登録して いますよね。static初期化子でこのような処理を行うことは JDBCドライバ・クラスの実装での決まりごとです。

  • qazwsxe
  • ベストアンサー率20% (2/10)
回答No.1

org.postgresql.Driverというクラスを初期化すると java.sql.DriverManagerというクラスに自分を登録して 、DriverManager.getConnection()としたときに postgresのコネクションがえられるようになります。 あとは、java.sql.DriverManagerのドキュメントを読むと参考になるかもしれません。

関連するQ&A

  • JDBCドライバーのロードに関して

    参考書やwebページのソースコードにJDBCドライバーのロードのときに、Class.forName("...")と書いているものと、Class.forName("...").newInstance()と書いているものがあります。[...部分は省略]この二つのコードは、どこが違うのでしょうか。また、Sunmicroのホームページで、forNameメソッドは、"指定された文字列名を持つクラスまたはインタフェースに関連付けられた、Class オブジェクトを返します。"と、newInstanceメソッドは、"この Class オブジェクトが表すクラスの新しいインスタンスを生成します。"と書かれていますが、どうしてこれで、JDBCドライバーがロードされるのですか?また、初歩的な質問ですが、JDBCドライバーがロードされるというのは、どうゆうことですか?教えてください。

    • ベストアンサー
    • Java
  • 『ClassNotFoundException: org.postgresql.Driver』というエラーが出る。

    CygwinにpostgreSQLをインストールして、JSPでデータベースを操作しようと考えています。 /usr/share/postgresql/java/postgresql.jarをCLASSPATHに追加し、以下に示すJSPを作成して実行したのですが、『java.lang.ClassNotFoundException: org.postgresql.Driver 』というエラーが出てデータベースにアクセスできません。 『$jar -xvf /usr/share/postgresql/java/postgresql.jar』を実行したところ、『org/postgresql/Driver.class』が抽出されましたので、ドライバクラスは間違ってはいないと思います。一体何が悪いのでしょうか。 <%@ page language="java" %> <%@ page contentType="text/html; charset=EUC_JP" %> <%@ page import="java.sql.*" %> <% Connection con = null; Statement stmt = null; try { Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql:(データベース名)"; con = DriverManager.getConnection(url, "(ユーザー名)", "(パスワード)"); stmt = con.createStatement(); (途中の処理) } catch(Exception e) { out.println(e); } finally { (データベースの切断処理) } postgreSQLはまだ始めたばかりですので初心者同然です。なるべく分かりやすく説明してくれると嬉しいです。 OSはWindowsXP, JSPコンテナはTomcat3.3.1を使用しています。どうぞよろしくお願い致します。

    • ベストアンサー
    • Java
  • Javaでデータベースにアクセス

    するときに以下のように Class.forName (driver); をする必要があるのですが これの意味を教えてください なぜこれが必要なのでしょうか? ・・・・・・・・・・・・・ // JDBCドライバの登録 String driver = "org.postgresql.Driver"; // データベースの指定 String url = "jdbc:postgresql://fedorasrv.com/test"; //サーバ名またはIPアドレス+データベース名 String user = "fedora"; //データベース作成ユーザ名 String password = "XXXXXXXX"; //データベース作成ユーザパスワード Class.forName (driver); // データベースとの接続 Connection con = DriverManager.getConnection(url, user, password); ・・・・・・・・・・・・・・

    • ベストアンサー
    • Java
  • JDBC PostgreSQLで必要なファイルはあるのでしょうか?

    LinuxでPostgreSQLのデータベースをJDBCでアクセスしたいのですが、以下のソースで次のエラーが発生します。何か必要なファイルでもあるのでしょうか? java.lang.ClassNotFoundException:org.postgres.Driver また、LinuxのODBCも必要なファイルがあるのでしょうか? import java.sql.*; class jdbcSample2 { public static void main(String argv[]) { int a; String b; try { //Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); //String url = "jdbc:odbc:test"; Class.forName ("org.postgres.Driver"); String url = "jdbc:postgresql://127.0.0.1:5432/test"; String user = ""; String password = ""; Connection con = DriverManager.getConnection(url, user, password); Statement stmt = con.createStatement (); String query = "select * from member;"; ResultSet rs = stmt.executeQuery (query); while(rs.next()){ a = rs.getInt(1); b = rs.getString(2); System.out.println(a + ", " + b); } rs.close(); stmt.close(); con.close(); } catch (SQLException ex) { System.err.println("SQL failed."); ex.printStackTrace (); } catch (Exception ex) { ex.printStackTrace (); } } }

  • JDBC ドライバーのロードの方法について

    すみませんが、どなたか教えていただけないでしょうか。 JDBCを使ってデータベースにアクセスしようとする場合に、まずドライバーのロードが必要ですが、 1.Class.forName("ドライバー名"); 2.Class.forName("ドライバー名").newInstance(); 1の方法と2の方法の違いは何かあるのでしょうか?今まで私は1の方法を使っていたのですが、2の方法があると知り、どのようなときに使うものなのかわかりません。このようなときにはこっちを使う、というようなルールや目安などありましたら、教えていただけますでしょうか。 ちなみに私は、データベースはDB2を使っています。 ↓また、以前に似たような(?)質問も見受けられたのですが、私にはちょっと難しくて理解できませんでした… http://okweb.jp/kotaeru.php3?q=642489 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • TomcatとPostgreSqlの接続について

    Tomcat4.0.4とApache1.3.26を使用しDBはPostgreSQLをつかっているのですが、DB接続がうまくいきません。 接続の際の記述は以下の通りです public void init(ServletConfig conf) throws ServletException { try{ Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql://localhost:8080:5432/test"; String user = "nakayama"; String pwd = "noah"; con = DriverManager.getConnection(url,user,pwd); }catch(Exception e){ err = err + "DataBase Connection err = " +e+"<br>"; } } これで実行すると、以下のエラーが出ます。 DataBase Connection err = Something unusual has occured to cause the driver to fail. Please report this exception: Exception: java.lang.NullPointerException Stack Trace: java.lang.NullPointerException at org.postgresql.Connection.openConnection(Connection.java:155) at org.postgresql.Driver.connect(Driver.java:149) at java.sql.DriverManager.getConnection(DriverManager.java:512) at java.sql.DriverManager.getConnection(DriverManager.java:171) at toroku2.init(toroku2.java:24) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:918) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:655) at ・・・・・ どうすれば解決できるのでしょうか? 教えてくださいm(__)m

    • ベストアンサー
    • Java
  • JDBCで配列を使ったSQL文(INSERT)

    早速ですがお願いします。例えば下のプログラムでのSQL文なのですが、配列str1[0]の中身”みかん”をINSERTしたいのですが、やりかたがわかりません。プログラミングの素人なので簡単な質問で申し訳ないですけど、どなたか教えてくれないでしょうか? ちなみにこのプログラムでstr1[0]のところを直接みかんと入れたらデータベースに追加することはできました。 import java.sql.*; class jdbc{ public static void main(String args[]){ String[] str1 = new String[1]; str1[0] = "みかん"; try{ Class.forName("org.postgresql.Driver"); String url = "jdbc:postgresql:test"; String user = ""; String password = ""; System.out.println("URL :" + url); System.out.println("USER :" + user); System.out.println("PASSWORD :" + password); Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); int insertCount = stmt.executeUpdate("INSERT INTO shinamono (hinmei,nedan) VALUES ('+str1[0]+', 1500)"); if (insertCount >0){ System.out.println("追加しました"); }else{ System.out.println("追加できませんでした"); } conn.commit(); stmt.close(); conn.close(); }catch(SQLException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } } } なおエラーメッセージは次の通りです。 java.sql.SQLException: ERROR: column "みかん" does not exist at org.postgresql.Connection.ExecSQL(Connection.java:533) at org.postgresql.jdbc2.Statement.execute(Statement.java:294) at org.postgresql.jdbc2.Statement.executeUpdate(Statement.java:78) at jdbc.main(jdbc.java:21)

  • javaでdbに接続したいのですが。

    javaからポストグレに接続したいのですが、エラーになります。 Class.forName("org.postgresql.Driver");の部分でclassnotfoundexceptionが発生しますので、 ドライバにパスが通ってないのでしょうか? PostgreSQL 8.4 postgresql-8.4-703.jdbc4.jar です。 システムの詳細設定でシステム環境変数 CLATHPASSにちゃんと設定しているのですがT T

    • ベストアンサー
    • Java
  • Google Web Toolkit(GWT)でのMySqlの接続

    こんにちは。現在GWT勉強中なのですが、MySqlの接続で大ハマリしています。どなたかご教示ください。 環境は以下のとおりです。 GWT:1.6.4 Eclipse:3.4.2 MySQL:5.1.31 MySQLConnector/J:5.1.7 EclipseでWeb Application Projectを作成し、デフォルトで作られる「GreetingServiceImpl」クラスの「public String greetServer(String input)」の中身を以下のように変更しました。 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ public String greetServer(String input) { String msg = ""; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); String url = "jdbc:mysql://localhost/gwt_samples"; String user = "root"; String password = "root"; Connection conn = DriverManager.getConnection(url, user, password); msg = "成功"; } catch(Exception e) { msg = "失敗"; } return msg; } _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 初めはClass.forName()の行で「java.lang.ClassNotFoundException: com.mysql.jdbc.Driver」が発生していましたが、/war/WEB-INF/libにMySQLConnector/JのJARファイルを追加することで発生しなくなりました。 しかし今度は、DriverManager.getConnectionでおかしくなっているようなんですが、その行でステップ実行すると、「RPC.class」の「invokeAndEncodeResponse()」というメソッドの「catch InvocationTargetException e) 」のところまでジャンプしてしまいます。 どなたか分かる方教えてください。 また、不明点あればご指摘ください。

  • JDBCドライバがない?

    PostgreSQLを使ったJavaアプリケーションをつくり、接続テストをしたところ、Tomcatのエラーで、HTTPステータス500となりました。 メッセージ: 「Cannot create JDBC driver of class '' for connect URL 'null'」 原因 org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' 原因 java.sql.SQLException: No suitable driver java.sql.DriverManager.getDriver(DriverManager.java:243) と表示されますので、JDBCのclassがないことが原因のようですが、どこを調べればよいかわかりません。 初心者です。よろしくご教授ください。 環境は次のとおりです。 OS:Linux(CentOS5) Tomcat5.5.28 PostgreSQL8.2.14 JDBCドライバ:postgresql-8.2-510.jdbc3.jar /var/webapps/tomcat/common/libに入れてあります。 環境変数のPATHの指定してあります。

専門家に質問してみよう