JDBC

JDBC (Java Database Connectivity)とは、JavaからデータベースにアクセスするためのAPIです。リレーショナルデータベースの種類に関わらず、標準化された方法で操作できます。

環境変数の設定

JDBCドライバをロードするJavaプログラムを実行する前に、CLASSPATH環境変数にクラス・ライブラリ・ファイルを含める必要があります。

LinuxのCシェルでCLASSPATH環境変数を設定する例を次に示します。

setenv CLASSPATH .:/opt/sample/lib/jdbc.jar

WindowsでCLASSPATH環境変数を設定する例を次に示します。

set CLASSPATH=.;C:\Program Files\sample\lib\jdbc.jar

CLASSPATH環境変数に含めるクラス・ライブラリ・ファイルのパス名は、使用するJDBCドライバによって異なります。

JDBCパッケージのインポート

JDBCを使用するJavaプログラムには、標準JDBCパッケージをインポートする必要があります。

import java.sql.*;

また、RDBMS固有のインタフェースを使用する場合は、オプションのJDBCパッケージもインポートする必要があります。

import javax.sql.*;

JDBCパッケージがスローする例外

JDBCパッケージのメソッドは、java.sql.SQLException 例外をスローすることがあります。したがって、JDBCパッケージのメソッドを呼び出す箇所では、これをキャッチまたはスロー宣言する必要があります。

java.sql.SQLException 例外キャッチする例を次に示します。

try {
  // JDBCパッケージのメソッド呼び出し
} catch (SQLException e) {
  // 例外処理
}

java.sql.SQLException 例外スロー宣言する例を次に示します。

public class void main(String args[]) throws SQLException {
  // JDBCパッケージのメソッド
}

JDBCドライバとは

JDBCドライバは次の4つのタイプに分類されている。

タイプ1
JDBCから ODBC (Open Database Connectivity) を介してデータベースにアクセスするJDBCドライバ
タイプ2
JDBCからデータベース固有のAPIを介してデータベースにアクセスするJDBCドライバ
タイプ3
JDBCから中継サーバを介してデータベースにアクセスするJDBCドライバ
タイプ4
データベース固有のJDBCドライバからデータベースにアクセスする

JDBCドライバのロード

JDBCドライバを使用するには、ドライバをロードする必要があります。Class.forName() メソッドを使用して、ドライバをロードすることができます。

static class forName(String className) throws ClassNotFoundException

引数 className には、クラス名を指定します。クラス名は、使用するRDBMSによって異なります。

H2 Database
org.h2.Driver
MySQL
com.mysql.jdbc.Driver
Oracle
oracle.jdbc.driver.OracleDriver
PostgreSQL
org.postgresql.Driver
SQLServer
com.microsoft.sqlserver.jdbc.SQLServerDriver
TimesTen
com.timesten.jdbc.TimesTenDriver

OracleでJDBCドライバをロードする例を次に示します。

try {
  Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
  // 例外処理
}

データベースとの接続

データベースと接続するには、DriverManager.getConnection() メソッドを使用します。

static Connection getConnection(String url) throws SQLException
static Connection getConnection(String url, String user, String password) throws SQLException

引数 url には、接続URLを指定します。接続URLはRDBMSによって異なります。

データベースに接続する際にユーザ名とパスワードが必要な場合は、引数 user にユーザ名、引数 password にパスワードを指定します。

Oracle Databaseの接続URL

Oracleには2種類のJDBCドライバーが用意されています。

Oracle JDBC Thin Driver は、クライアントライブラリを使用せずに Net8 プロトコルを用いて直接Oracleデータベースに接続するタイプのJDBCドライバです。クラスライブラリだけで動作するので、Oracle Clientがインストールされていない環境でも動作させることが可能です。

使用するJDBCドライバーにより、接続URLの書式が異なります。つまり、JDBCアプリケーションは、接続URLによって使用するJDBCドライバーを指定することになります。

Oracle JDBC OCI Driverの接続URLの書式を次に示します。

jdbc:oracle:oci8:@データベースサービス名

Oracle JDBC Thin Driverの接続URLの書式を次に示します。

jdbc:oracle:thin:@ホスト名:ポート番号:SID

Oracle JDBC Thin Driver を使って、Oracleデータベースに接続する例を次に示します。

try {
  String url = "jdbc:oracle:thin:@localhost:1521:o8ibegin";
  Connection conn = DriverManager.getConnection(url);
} catch (SQLException e) {
  // 例外処理
}

MySQL

try {
  String url = "jdbc:mysql://localhost/testdb?user=tsuka&password=neogon";
  Connection conn = DriverManager.getConnection(url);
} catch (SQLException e) {
  // 例外処理
}

PostgreSQL

try {
  String url = "jdbc:postgresql://localhost:5432/testdb";
  Connection conn = DriverManager.getConnection(url, "tsuka", "neogon");
} catch (SQLException e) {
  // 例外処理
}

SQLServer

try {
  String url = "jdbc:sqlserver://localhost:1433;databaseName=testdb;user=tsuka;password=neogon";
  Connection conn = DriverManager.getConnection(url);
} catch (SQLException e) {
  // 例外処理
}

TimesTen In-Memory Databaseの接続URL

TimesTenの接続URLの書式を次に示します。

jdbc:timesten:{direct | client}:dsn=データソース名[;接続属性 ...]

接続オプションとして、ダイレクト・ドライバ接続を行う場合には direct 、クライアント/サーバ接続を行う場合には client を指定します。

TimesTenのデータ・ストアに接続する例を次に示します。

String url = "jdbc:timesten:direct:dsn=demo;LockLevel=1";
Connection conn = DriverManager.getConnection(url);

データソース

データソースとは、アプリケーションサーバ(WebLogic ServerやTomcatなど)において、アプリケーションにデータベース接続サービスを提供する機能である。データソースを使用することにより、アプリケーションはデータベース接続に必要な情報(DBサーバのホスト名やポート、データベース名、データベースユーザ名、パスワードなど)を意識せずにデータベース接続を行える。

アプリケーションがJDBCデータソースでデータベースに接続するには、JNDIでデータソースをルックアップしてからgetConnection()を呼び出すことで、データベース接続を取得する。

ステートメントの作成

SQL文を実行する前に、SQLステートメントのオブジェクトを作成する必要があります。ステートメントを作成するには、 Connection.createStatement() メソッドを使用します。

Statement createStatement() throws SQLException

ステートメントを作成する例を次に示します。

Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();

INSERT, UPDATE, DELETEの実行

INSERT, UPDATE, DELETE などのSQL文を実行するには、 Statement.executeUpdate() メソッドを使用します。

int executeUpdate(String sql) throws SQLException

行を挿入するJavaソース・コードの例を次に示します。

Statement stmt = conn.createStatement();
String sql = "INSERT INTO EMP VALUES ('Yamada')";
ResultSet rset = stmt.executeUpdate(sql);

問い合わせ(クエリ)の実行

問い合わせ(クエリ)を行うには、Statement.executeQuery() メソッドを使用します。

ResultSet executeQuery(String sql) throws SQLException

問い合わせを行うと、その結果セットが得られます。結果セットには、問い合わせで得られた行が0~複数行含まれています。

結果セットから行を取り出す前に、カーソルを次に進める必要があります。カーソルは、結果セットに含まれる複数の行のうち、取り出すことのできる行の位置を指しています。

カーソルを次に進めるには、ResultSet.next() メソッドを使用します。

boolean next() throws SQLException

カーソルを次の行に進めることができた場合は、戻り値として true が戻ります。結果セットにそれ以上の行が含まれていない場合は、戻り値として false が戻ります。

カーソルを進めたら、カーソルが指している行から列の値を取り出すことができます。列の値を取り出すために、取り出す値の型によってさまざまなメソッドが用意されています。

String getString(int columnIndex) throws SQLException
String getString(String columnName) throws SQLException
int getInt(int columnIndex) throws SQLException
int getInt(String columnName) throws SQLException

列を指定する方法には、引数 columnIndex に列番号を指定する方法と、引数 columnName に列名を指定する方法の2通りがあります。列番号は1から始まります。

結果セットが不要になったら、クローズします。結果セットをクローズするには、 ResultSet.close() メソッドを使用します。

void close() throws SQLException

問い合わせを行うJavaソース・コードの例を次に示します。

Statement stmt = conn.createStatement();
String sql = "SELECT ENAME FROM EMP";
ResultSet rset = stmt.executeQuery(sql);
while (rset.next()) {
  System.out.println(rset.getString(1));
}
rset.close();

データベースとの切断

データベースと切断するには、Connection.close() メソッドを使用します。

void close() throws SQLException

データベースと切断する例を次に示します。

Connection conn = DriverManager.getConnection(url);
conn.close();

自動コミット

JDBCでは、デフォルトで自動コミットが有効になっています。自動コミットが有効であると、SQL文を実行するたびに自動的にコミットが行われます。自動コミットが無効であると、コミット/ロールバックを明示的に行うことができます。

現在の自動コミットの状態を調べるには、Connection.getAutoCommit() メソッドを使用します。

boolean getAutoCommit() throws SQLException

自動コミットが有効であれば true、無効であれば false を戻します。

自動コミットの有効/無効を切り替える

自動コミットの有効/無効を切り替えるには、Connection.setAutoCommit() メソッドを使用します。

void setAutoCommit(boolean autoCommit) throws SQLException

自動コミットを有効にするには、引数 autoCommit に true を指定します。自動コミットを無効にするには、引数 autoCommit に false を指定します。

コミット

トランザクションを明示的にコミットするには、Connection.commit() メソッドを使用します。

void commit() throws SQLException

自動コミットが有効になっているときは、明示的にコミットする必要はありません。

ロールバック

トランザクションをロールバックするには、Connection.rollback() メソッドを使用します。

void rollback() throws SQLException

自動コミットが有効になっているときは、ロールバックすることはできません。

SQL文の準備

複数回繰り返し実行するSQL文は、事前にSQL文を準備しておき、それを実行した方がパフォーマンスが向上します。

SQL文を準備するには、Connection.createStatement() メソッドでステートメントを作成する代りに、 Connection.prepareStatement() メソッドを使用して準備済みステートメントを作成します。

PreparedStatement prepareStatement(String sql) throws SQLException

引数 sql には、準備するSQL文を指定します。

INSERT, UPDATE, DELETEなどを行うには、PreparedStatement.executeUpdate() メソッドを使用します。

int executeUpdate() throws SQLException

問い合わせを行うには、PreparedStatement.executeQuery() メソッドを使用します。

ResultSet executeQuery() throws SQLException

準備済みステートメントが不要になったら、PreparedStatement.close() メソッドを使用して、クローズします。

void close() throws SQLException

ストアドプロシージャの呼び出し

CallableStatement は、SQLストアドプロシージャを実行するのに使用されるインタフェースです。これにより、すべてのRDBMSに対して標準の方法でストアドプロシージャを呼び出すことができます。

CallableStatement オブジェクトを生成するには、Connection.prepareCall()メソッドを使用します。

CallableStatement prepareCall(String sql) throws SQLException

CallableStatement オブジェクトは、そのINとOUTパラメータを設定するメソッドとストアドプロシージャの呼び出しを実行するメソッドを提供します。

ストアドプロシージャを呼び出すには、CallableStatement.execute()メソッドを使用します。

boolean execute() throws SQLException

JDBCでストアドプロシージャを呼び出すJavaソースコードの例を次に示します。

Connection conn;
CallableStatement callStmt;

// データベースとの接続部分は省略
callStmt = conn.prepareStatement("{call ttXlaBookmarkCreate('bookmark')}");
callStmt.execute();

JDBCのサンプルソースコードを次に示します。

import java.sql.*;
  class Employee {
    public static void main(String args[]) throws SQLException {

    // Load the Oracle JDBC driver
    DriverManager.registerDriver
      (new oracle.jdbc.driver.OracleDriver());

    //  Connect to the database
    Connection conn = DriverManager.getConnection(
      "jdbc:oracle:thin:@localhost:1521:o8ibegin",
      "scott", "tiger");

    // Create a Statement
    Statement stmt = conn.createStatement();

    // Select the ENAME column from the EMP table
    ResultSet rset = stmt.executeQuery("select ENAME from EMP");

    // Iterate through the result and
    // print the employee names
    while (rset.next())
      System.out.println(rset.getString(1));

    rset.close();
    conn.close();
  }
}

SQLからJavaへのマッピング

SQLのデータ型は、Java のデータ型と同一ではないので、Java の型を使用するアプリケーションと SQL の方を使用するデータベースの間でデータを読み書きするためのメカニズムが必要です。 これを達成するために、JDBC は getXXX メソッドと setXXX メソッドのセット、メソッド registerOutParameter、およびクラス Types を用意しています。

JDBCの型とJavaの型の対応表を次に示します。

Javaの型にマッピングされるJDBCの型
JDBC Java
CHAR, VARCHAR, LONGVARCHAR java.lang.String
NUMERIC, DECIMAL java.math.BigDecimal
BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
BIGINT long
REAL float
FLOAT, DOUBLE double
BINARY, VARBINARY, LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
JDBCの型にマッピングされるJava の型
Java JDBC
String VARCHARまたはLONGVARCHAR
java.math.BigDecimal NUMERIC
boolean BIT
byte TIMYINT
short SMALLINT
int INTEGER
long BIGINT
float REAL
double DOUBLE
byte[] VARBINARYまたはLONGVARBINARY
java.sql.Date DATE
java.sql.Time TIME
java.sql.Timestamp TIMESTAMP

JDBC型からOracleデータ型へのマッピング

JDBCでアクセスするデータベースがオラクルの場合、JDBCのデータ型はJavaのデータ型を通じて、最終的にOracleのデータ型に変換されます。JDBCのデータ型とOracleのデータ型の対応表を次に示します。

Oracleのデータ型にマッピングされるJDBCのデータ型
JDBC Oracle
CHAR CHAR
VARCHAR VARCHAR2
LONGVARCHAR LONG
VARBINARY RAW
LONGVARBINARY LONG RAW
数値型 NUMBER
日付型 DATE

SQL のデータ型を Javaにマッピングする

異なるデータベース製品がサポートする SQL の型の間には違いがあります。異なるデータベースが同一の意味をもつ SQL の型をサポートしている場合でも、それらの型に異なる名前を与えていることもあります。たとえば、主要データベースのほとんどが大きなバイナリ値に対する SQL の型をサポートしていますが、Oracle ではこの型を LONG RAW 、 Sybase では IMAGE 、Informix では BYTE 、DB2 では LONG VARCHAR FOR BIT DATA とそれぞれ呼んでいます。

JDBC プログラマは、普通の場合には、ターゲットのデータベースが使用している実際の SQL の型名に気を使う必要はない。多くの場合、 JDBC プログラマは、既存のデータベースのテーブルに対してプログラミングをし、そうしたテーブルを作成した正確な SQL の型名に注意を払う必要はない。

JDBC は、クラス java.sql.Types で汎用的な SQL の型識別子のセットを定義している。そのセットの型は、最も普通に使用される SQL の型を表すように設計されている。JDBC API によるプログラミングでは、プログラマは通常、ターゲットのデータベースが使用している正確な SQL の型名に注意することなく、そのセットの JDBC 型を使用して汎用的な SQL の型を参照することができる。

プログラマが SQL の型名を主に使用する必要のあるのは、新しいデータベースのテーブルを作成する場合の SQL CREATE TABLE 文の中である。この場合には、プログラマは、そのターゲットのデータベースがサポートしている SQL の型名を使用するように注意する必要がある。特定のデータベースでのさまざまな SQL の型の動作の正確な定義を必要とする場合には、そのデータベースのマニュアルを参照する必要がある。

広範囲に異なるデータベース上でテーブルを作成できる移植性の高い JDBC プログラムを作成したい場合には、2 つの主な選択肢がある。第一は、INTEGER、NUMERIC、または VARCHAR のようなすべてのデータベースに対して稼動する可能性の高い、非常に広範囲で受け入れられている SQL の型名だけを使用するように制約する。あるいは、第二の選択肢では、java.sql.DatabaseMetaData.getTypeInfo メソッドを使用して、どの SQL の型をそのデータベースが実際にサポートしているかを発見し、指定の JDBC 型に一致するデータベース固有の SQL の型名を選択することができる。

JDBC は、JDBC データベース型から Java への標準マッピングを定義する。たとえば、 JDBC INTEGER は通常、 Java int にマップされる。これは、JDBC 値を単純な Java 型として読み書きする単純なインタフェースをサポートする。

Java の型は、SQL タイプと正確に同型である必要はない。パラメータを正確に格納したり取り出したりし、SQL 文からの結果を復旧するのに十分な型の情報でそれらを表現できればよい。たとえば、Java の String オブジェクトは、 JDBC CHAR 型のいずれにも厳密には一致しないが、CHAR、VARCHAR、または LONGVARCHAR を正常に表現するのに十分な型情報を与える。

JDBC の型

CHAR、VARCHAR、および LONGVARCHAR

JDBC の型 CHAR、VARCHAR、および LONGVARCHAR は密接に関連している。CHAR は短い固定長の文字列を、VARCHAR は短い可変長の文字列を、LONGVARCHAR は長い可変長の文字列をそれぞれ表す。

JDBC CHAR に対応する SQL CHAR 型は SQL-92 で定義され、すべての主要なデータベースによってサポートされ、文字列の長さを指定するパラメータを取る。したがって、 CHAR(12) は 12 文字長の文字列を定義する。すべての主要なデータベースは、CHAR 長を最高 254 文字までサポートしている。

JDBC VARCHAR に対応する SQL VARCHAR 型は SQL-92 で定義され、すべての主要なデータベースによってサポートされ、文字列の最大長を指定するパラメータを取る。したがって、 VARCHAR(12) はその長さが最高 12 文字長の文字列を定義する。すべての主要なデータベースは、VARCHAR の長さを最高 254 文字までサポートしている。 文字列値が VARCHAR 変数に割り当てられると、データベースは割り当てられた文字列の長さを記憶し、それの SELECT 時に正確に元の文字列を返す。

JDBC LONGVARCHAR 型には、一貫した SQL マッピングが存在しない。すべての主要なデータベースは、最低でも 1 ギガバイトまでをサポートするある種の非常に長い可変長の文字列をサポートしますが、SQL の型名は異なる。

Java のプログラマは、CHAR、VARCHAR、および LONGVARCHARの SQL 文字列の 3 つの型を区別する必要がない。それぞれは Java の String として表現することができ、期待された正確なデータ型を知らなくても SQL 文を正しく読み書きすることができる。

CHAR、VARCHAR、および LONGVARCHAR は、String または char[] のいずれにもマップすることができるが、String の方が通常の使用のためにはより適切である。また、String クラスにより、String と char[] の間の変換がより簡単になる。String オブジェクトを char[] に変換するメソッドがあり、また char[] を String オブジェクトに調整する構築子もある。

対処すべき問題の 1 つは、CHAR(n) 型の固定長 SQL 文字列をどのように処理するかである。答えは、JDBC drivers (または DBMS) が空白で適切なパディングを行うことである。したがって CHAR(n) フィールドがデータベースから取り出されたとき、ドライバがそれを長さが n の Java の String オブジェクトに変換するが、これには末尾にパディングの空白がいくつか含まれている可能性がある。これとは逆に、String オブジェクトが CHAR(n) フィールドに送信されると、ドライバおよび / またはデータベースが必要なパディング用空白を文字列の末尾に追加し、その長さを n にする。

メソッド ResultSet.getString は、新しい String オブジェクトを割り当てたり返したりするが、データを CHAR、VARCHAR、および LONGVARCHAR フィールドから取り出すことを推奨する。これは通常のデータを取り出すには適切であるが、 JDBC の LONGVARCHAR 型を使用して何メガバイトかの文字列を格納する場合は扱いにくいことがある。このようなケースを処理するために、LONGVARCHAR インタフェースの 2 つのメソッドにより、プログラマが LONGVARCHAR の値を任意のサイズの塊でシーケンシャルにデータを読み取れる Java 入力ストリームとして取り出すことができるようにしている。これらのメソッドは getAsciiStream と getUnicodeStreamで、LONGVARCHAR 列に格納されているデータを ASCII または Unicode 文字のストリームとして配信する。

BINARY、VARBINARY、および LONGVARBINARY

JDBC の型 BINARY、VARBINARY、および LONGVARBINARY は密接に関連している。BINARY は小さい固定長のバイナリ値を、VARBINARY は小さな可変長のバイナリ値を、LONGVARBINARY は大きな可変長のバイナリ値をそれぞれ表す。

以上の BINARY 型は標準化されていなく、サポートは主要なデータベース間で相当に変動する。

JDBC BINARY に対応する SQL BINARY 型は、非標準の SQL の拡張で、一部のデータベースに実装されているにすぎない。バイナリ バイトの数を指定するパラメータを取る。従って、BINARY(12) は 12 バイトのバイナリ型を定義する。 普通、 BINARY 値は 254 バイトに限定されている。

JDBC VARBINARY に対応する SQL VARBINARY 型は、非標準の SQL の拡張で、一部のデータベースに実装されているにすぎない。バイナリ バイトの最大数を指定するパラメータを取る。したがって、VARBINARY(12) はその長さの最大長が 12 バイトであるバイナリ型を定義する。普通、 VARBINARY 値は 254 バイトに限定されている。バイナリ値が VARBINARY 変数に割り当てられると、データベースは割り当てられた値の長さを記憶し、それの SELECT時に、元の値を正確に返す。

JDBC LONGVARBINARY 型に対応する一貫した SQL の型は存在しない。すべての主要なデータベースは、最低でも 1 ギガバイトのデータをサポートする、ある種の非常に大きな可変長のバイナリ型をサポートするが、 その SQL の型名は異なる。

BINARY、VARBINARY、および LONGVARBINARY は、 Java ではバイト配列として、すべて同じように表現できる。要求されている BINARY データ型を正確に知らなくても、SQL 文を正しく読み書きできるため、Java プログラマがそれらの型を区別する必要はない。

BINARY や VARBINARY の値を取り出すために推奨されるメソッドは、ResultSet.getBytes である。 JDBC LONGVARBINARY 型の列が何メガバイト長のバイト配列を格納している場合には、getBinaryStream メソッドを推奨する。LONGVARCHAR の場合と同様に、このメソッドは Java プログラマが LONGVARBINARY 値を、後でより小さな塊で読むことができる Java 入力ストリームとして取り出すことを可能にする。

BIT

JDBC 型 の BIT は、0 か 1 を取り得る単一のビット値を表す。

SQL-92 は、SQL BIT 型を定義する。しかし、 JDBC BIT 型とは異なり、この SQL-92 BIT 型は、固定長のバイナリ列を定義するパラメータ化した型として使用することができる。SQL-92 は、単一のビットを表すのに単純な非パラメータ化 BIT 型の使用も許している。この使用は、 JDBC BIT 型に対応している。SQL-92 BIT 型は、「完全な」 SQL-92 においてだけ要求され、現在、主要なデータベースの一部にしかサポートされていない。したがって、移植性を望むコードでは、広くサポートされている JDBC SMALLINT 型の方を使用することを勧める。

JDBC BIT 型に対して推奨される Java マッピングは、Java の boolean 型とするものである。

TINYINT

JDBC 型の TINYINT は、0 から 255 までの 8 ビットの符号なし整数値を表す。

対応する SQL の型の TINYINT は現在、主要なデータベースの一部しかサポートしていない。したがって、移植性を望むコードでは、広くサポートされている JDBC SMALLINT 型の方を使用することを勧める。

JDBC TINYINT 型に対して推奨されている Java マッピングは、 Java byte か Java short のいずれかである。8 ビットの Java byte 型は -128 から 127 までの符号付きの値を表すので、より大きな TINYINT 値に対して常に適切になるとは限らない。ただし、16 ビットのJava short は常にすべての TINYINT 値を保持することができる。

SMALLINT

JDBC 型の SMALLINT は、-32,768 から 32,767 までの 16 ビットの符号付き整数値を表す。

対応する SQL の型の SMALLINT は SQL-92 で定義され、すべての主要がデータベースによってサポートされている。SQL-92 標準では、SMALLINT の精度を実装に任せているが、実際には、すべての主要なデータベースは少なくとも 16 ビットをサポートしている。

JDBC SMALLINT 型に対して推奨される Java マッピングは、 Java shortとするものである。

INTEGER

JDBC 型の INTEGER は、-2,147,483,648 から 2,147,483,647 までの 32 ビットの符号付き整数値を表す。

対応する SQL の型の INTEGER は SQL-92 で定義され、すべての主要なデータベースによって広くサポートされている。SQL-92 標準では、 INTEGER の精度を実装に任せているが、実際には、すべての主要なデータベースは少なくとも 32 ビットをサポートしている。

JDBC INTEGER 型に対して推奨される Java マッピングは、 Java intとするものである。

BIGINT

JDBC 型の BIGINT は、-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 までの 64 ビットの符号付き整数値を表す。

対応する SQL の型の BIGINT は、SQL の 非標準の拡張である。実際、 SQL BIGINT 型は、主要なデータベースのいずれにも現在実装されていない。したがって、移植性を期待されるコードでは、その使用を避けるように勧める。

JDBC BIGINT 型に対して推奨される Java マッピングは、 Java long とするものである。

REAL

JDBC 型の REAL は、7 桁の仮数部をサポートする「単精度」の浮動小数点数である。

対応する SQL の型の REAL は SQL-92 で定義され、すべての主要なデータベースによって、一般的ではないが、広くサポートされている。SQL-92 標準では、REAL の精度を実装に任せているが、実際には、すべての主要なデータベースは少なくとも 7 桁の仮数精度をサポートしている。

JDBC REAL 型に対して推奨される Java マッピングは、Java float とするものである。

DOUBLE

JDBC 型の DOUBLE は、15 桁の仮数部をサポートする「倍精度」の浮動小数点数である。

対応する SQL の型は、 DOUBLE PRECISION であり SQL-92 で定義され、すべての主要なデータベースによって、広くサポートされている。SQL-92 標準では、DOUBLE PRECISION の精度を実装に任せているが、実際には、すべての主要なデータベースは少なくとも 15 桁の仮数精度をサポートしている。

JDBC DOUBLE 型に対して推奨される Java マッピングは、Java double とするものである。

FLOAT

JDBC 型の FLOAT は、基本的には JDBC 型の DOUBLE と等価である。FLOAT と DOUBLE の両方を提供したのは、以前のデータベースの API との一貫性を維持しようとしたためであるが、混乱を起こす危険性が考えられる。FLOAT は、15 桁の仮数部をサポートする「倍精度」浮動小数点数である。

対応する SQL の型の FLOAT は SQL-92 で定義されている。 SQL-92 標準では、FLOAT の精度を実装に任せているが、実際には、 FLOAT をサポートするすべての主要なデータベースは少なくとも 15 桁の仮数精度をサポートしている。

この FLOAT 型に対して推奨される Java マッピングは、Java double とするものである。ただし、倍精度の SQL FLOAT と単精度の Java float との間の混乱が予想されるため、JDBC プログラマは、普通の場合には、FLOAT よりも JDBC DOUBLE 型を使用するように勧める。

DECIMAL と NUMERIC

JDBC 型の DECIMAL と NUMERIC は非常に似ている。両方とも、固定精度の 10 進数を表す。

対応する SQL の型の DECIMAL と NUMERIC はSQL-92 で定義され、非常に広範囲に実装されている。この 2 つの SQL の型は、精度とスケールのパラメータを取る。精度は、サポートされている 10 進数の総桁数で、スケールは、小数点以下の桁数である。スケールは常に、精度以下になることが必要である。したがって、たとえば、"12.345" の精度は 5 であり、スケールは 3 となる。".11" の精度は 2 であり、スケールは 2 となる。 JDBC は、すべての DECIMAL と NUMERIC の両方の型が、少なくとも 15 の精度とスケールをサポートすることを要求する。

DECIMAL と NUMERIC の唯一の相違は、 SQL-92 仕様が、NUMERIC 型が正確に指定の精度で表現されることを要求する一方で、DECIMAL 型では、型の生成時に指定された精度を超えた精度を追加することを実装に許している点にある。したがって、型の NUMERIC(12,4) で作成された列は、常に正確に 12 桁で表され、型の DECIMAL(12,4) で作成された列は、より大きな桁数で表されることもある。

DECIMAL と NUMERIC の型に対して推奨される Java マッピングは、やはり絶対精度をもつ固定小数点数で表される Java 型の java.math.BigDecimal である。java.math.BigDecimal 型は、数学演算を可能として、BigDecimal 型を他の BigDecimal 型、整数型、および浮動少数点型と加減乗除することができる。

DECIMAL と NUMERIC の値を取り出すために推奨されるメソッドは、ResultSet.getBigDecimal である。 JDBC はまた、単純な Strings または char の配列としてこれらの SQL の型へのアクセスを可能にする。したがって、Java プログラマは、getString を使用して NUMERIC または DECIMAL の結果を受け取ることができる。ただし、これにより、アプリケーションの作成者が文字列上で算術計算をすることが必要になるので、DECIMAL またはNUMERIC を通貨の値として使用する一般的な場合が、むしろ扱いにくくなる。これらの SQL の型を Java の数値型のいずれかとして取り出すことも可能である。

DATE、TIME、および TIMESTAMP

時間に関連する JDBC の型には以下の 3 つがある。

標準の Java クラス java.util.Date は、これら 3 つの JDBCの date と time の型に正確には一致しないので (標準の Java クラスは DATE と TIME の情報はあるが、ナノ秒がない)、JDBC は java.util.Date の 3 つのサブクラスを定義して、SQL の型に対応している。これらは以下のとおりである。

JDBC の 3 つの時間関連のクラスはすべて java.util.Date のサブクラスなので、java.util.Date が期待されている場所で使用することができる。たとえば、国際化メソッドは java.util.Date オブジェクトを引数として取るので、JDBC 時間関連クラスのいずれかのインスタンスとして渡すことができる。

JDBC Timestamp オブジェクトには、その親の日付と時間の構成要素と、それとは別にナノ秒の構成要素もある。java.util.Date オブジェクトが期待されている箇所で、java.sql.Timestamp オブジェクトを使用すると、ナノ秒の構成要素は失われる。ただし、java.util.Date オブジェクトが 1 ミリ秒の精度で格納されているので、java.sql.Timestamp オブジェクトを java.util.Date オブジェクトに変換したときにこの程度の精度を保つことは可能である。これは、ナノ秒構成要素の中のナノ秒を (ナノ秒の数値を 1,000,000 で割ることにより ) まったくのミリ秒に変換してから、結果を java.util.Date オブジェクトに加算します。999,999 ナノ秒まではこの変換によって失われるが、結果として生じる java.util.Date オブジェクトは 1 ミリ秒以内の誤差の精度を持つ。

以下の部分的なコードは、1 ミリ秒以内の精度を持つ java.util.Date オブジェクト に java.sql.Timestamp オブジェクトを変換する例である。

Timestamp t = new Timestamp(100, 0, 1, 15, 45, 29, 987245732);
java.util.Date d;
d = new java.util.Date(t.getTime() + (t.getNanos() / 1000000));