メニュー

プロダクト



プログラミング


  • Java
    • Web 技術
    • メール技術
      • JavaMail
      • Apache James Mailet
    • Web フレームワーク
      • Jakarta Struts
      • Jakarta Velocity
      • Jakarta Tapestry
      • WebWork2
      • Jakarta Jetspeed
      • Apache Cocoon 2
    • DB 技術
      • JDBC
      • Hibernate
      • Apache Torque
    • DI (IoC) コンテナ
      • Spring Framework
      • Seasar2
      • Apache HiveMind
      • PicoContainer
    • 属性プログラミング
    • テスティング
      • JUnit
      • Jakarta Cactus
      • DBUnit
      • djUnit
      • FitNesse
    • ロギング
      • Apache Log4j
      • Jakarta Commons logging
    • 分散コンポーネント技術
      • EJB
    • リッチ クライアント
      • Java Web Start
    • GUI
    • XML Web サービス
      • Apache Axis
      • Apache SOAP
    • アプリケーション管理
    • トランザクション
    • 開発環境
      • Apache Ant
      • Apache Maven
      • Apache Maven2
    • Eclipse
    • Tips
  • .NET Framework
  • PHP
  • XML
    • SmartDoc
  • 正規表現
  • VB, VBA, VBScript, ASP
  • C/C++

DBMS


  • MySQL
  • PostgreSQL
  • Oracle
  • Microsoft SQL Server
  • HSQLDB
  • SQLite
  • Apache Xindice

アプリケーション サーバ



OS



バージョン管理システム



未整理


最近更新したページ
このウィキの読者になる
更新情報がメールで届きます。
このウィキの読者になる

JDBC

  • Java で RDB にアクセスするための標準的な API です。

接続 (DriverManager)


Class.forName() メソッドでクラスをアプリケーション中に読み込み、 DriverManager.getConnection() メソッドでデータベース接続を取得します。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection("jdbc:odbc:test", "user", "pass");

接続 (DataSource)


JNDI サービスに DataSource を登録し、 DataSource からデータベース接続を取得する方法です。 JNDI サービスが利用できる環境では、この方法が推奨されています。

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/test");
Connection conn = ds.getConnection();

切断


Connection#close() メソッドを呼び出して接続を閉じます。ガベージ コレクタでは閉じられないので、確実に閉じる必要があります。一般的には、以下のように try-finally ブロックで囲みます。

Connection conn = DriverManager.getConnection("jdbc:odbc:test", "user", "pass");
try {
    // 適当な処理
} finally {
    conn.close();
}

SQL を発行


検索系 (Statement)


  • Connection#createStatement() メソッドで Statement を取得、
  • Statement#executeQuery() メソッドで ResultSet を取得、
  • ResultSet#getXXX() メソッドで結果を取得します。

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from foo");
try {
    while (rs.next()) {
        System.out.println(rs.getInt("id"));
        System.out.println(rs.getString("name"));
    }
} finally {
    rs.close();
}

更新系 (Statement)


Statement#executeUpdate() メソッドで更新を行います。

Statement st = conn.createStatement();
int result = st.executeUpdate("insert into foo (id, name) values (1, 'foo')");

検索系 (PreparedStatement)


  • Connection#prepareStatement() メソッドで SQL がプリコンパイルされた PreparedStatement を取得、
  • PreparedStatement#setXXX() メソッドでパラメータを設定、
  • PreparedStatement#executeQuery() メソッドで ResultSet を取得、
  • ResultSet#getXXX() メソッドで結果を取得します。

PreparedStatement st = conn.prepareStatement("select * from foo where id = ?");
st.setInt(1, 100);
ResultSet rs = st.executeQuery();
try {
    while (rs.next()) {
        System.out.println(rs.getInt("id"));
        System.out.println(rs.getString("name"));
    }
} finally {
    rs.close();
}

  • パラメータは ? として埋め込みます。
  • パラメータのインデックス番号は 1 から始まります。
  • SQL インジェクション対策にもなります。 Statement より PreparedStatement を積極的に活用すべきです。

更新系 (PreparedStatement)


PreparedStatement#executeUpdate() メソッドで更新を行います。

PreparedStatement st = conn.prepareStatement("insert into foo (id, name) values (?, ?)");
st.setInt(1, 100);
st.setString(2, "foo");
int result = st.executeUpdate();

トランザクション


  • Connection#setAutoCommit() メソッドで自動コミットを抑止します。これでトランザクションが開始されます。自動コミットを抑止しない場合、更新系 SQL は常にコミットされます。
  • Connection#commit() メソッドでトランザクションをコミットします。
  • Connection#rollback() メソッドでトランザクションをロールバックします。

conn.setAutoCommit(false);
try {
    PreparedStatement st = conn.prepareStatement("insert into foo (id, name) values (?, ?)");
    st.setInt(1, 100);
    st.setString(2, "foo");
    st.executeUpdate();
    conn.commit();
} catch (SQLException e) {
    conn.rollback();
    throw e;
}

参照


2005年12月07日(水) 21:47:44 Modified by uguuxp




スマートフォン版で見る