基本データ型の使用

ダウンロードJDBC Driver のダウンロード

SQL Server 用 Microsoft JDBC ドライバー は、JDBC の基本データ型を使用して、SQL Server データ型を Java プログラミング言語によって認識できる形式に変換します。この逆の変換も行います。 JDBC ドライバー は SQLXML データ型を含む JDBC 4.0 api および NCHARNVARCHARLONGNVARCHAR、そして NCLOB のような National (Unicode) データ型のサポートを提供します。

データ型マッピング

次の表は、SQL Server、JDBC、および Java プログラミング言語の基本データ型間で行われる既定のマッピングを示しています。

SQL Server 型 JDBC 型 (java.sql.Types) Java 言語型
bigint bigint long
binary BINARY byte[]
bit BIT boolean
char CHAR String
date DATE java.sql.Date
datetime3 timestamp java.sql.Timestamp
datetime2 timestamp java.sql.Timestamp
datetimeoffset2 microsoft.sql.Types.DATETIMEOFFSET microsoft.sql.DateTimeOffset
decimal DECIMAL java.math.BigDecimal
float DOUBLE double
image LONGVARBINARY byte[]
INT INTEGER INT
money DECIMAL java.math.BigDecimal
nchar CHAR

NCHAR (Java SE 6.0)
String
ntext LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String
numeric NUMERIC java.math.BigDecimal
nvarchar VARCHAR

NVARCHAR (Java SE 6.0)
String
nvarchar(max) VARCHAR

NVARCHAR (Java SE 6.0)
String
real real float
smalldatetime timestamp java.sql.Timestamp
smallint SMALLINT short
smallmoney DECIMAL java.math.BigDecimal
text LONGVARCHAR String
time TIME1 java.sql.Time1
timestamp BINARY byte[]
tinyint TINYINT short
udt VARBINARY byte[]
UNIQUEIDENTIFIER CHAR String
varbinary VARBINARY byte[]
varbinary(max) VARBINARY byte[]
varchar VARCHAR String
varchar(max) VARCHAR String
xml LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String

SQLXML
sqlvariant microsoft.sql.Types.SQL_VARIANT Object
geometry VARBINARY byte[]
geography VARBINARY byte[]

1 時刻の SQL Server データ型を持つ java.sql.Time を使用する場合は、sendTimeAsDatetime 接続プロパティを false に設定します。

2 DateTimeOffset Classdatetimeoffset の値にプログラムでアクセスできます。

3 SQL Server 2016 以降、datetime 列からの値を比較するために java.sql.Timestamp 値を使用することができなくなりました。 この制限は、datetime を datetime2 に異なるように変換し、値が同じでなくなるサーバー側の変更に起因するものです。 この問題を回避するには、datetime 列を datetime2(3) に変更するか、java.sql.Timestamp ではなく String を使用するか、データベースの互換性レベルを 120 以下に変更します。

以下のセクションでは、JDBC ドライバーと基本データ型の使用方法の例を示します。 Java アプリケーションの基本データ型の使用方法の詳細例については、「基本データ型のサンプル」をご覧ください。

文字列としてのデータの取得

文字列として参照するために JDBC 基本データ型にマップされるデータ ソースからデータを取得する必要がある場合、または厳密に型指定されたデータを必要としない場合は、次のように SQLServerResultSet クラスの getString メソッドを使用できます。

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getString("job_id");
}

データ型によるデータの取得

データ ソースからデータを取得する必要があり、取得するデータの型がわかっている場合は、SQLServerResultSet クラスのいずれかの get<Type> メソッドを使用します。これらは、"getter メソッド" とも呼ばれます。 get<Type> メソッドでは、次のように列名または列インデックスを使用できます。

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getShort("job_id");
}

注意

getUnicodeStream メソッドおよび小数点以下桁数付きの getBigDecimal メソッドは、JDBC ドライバーでは非推奨とされているため、サポートされていません。

データ型によるデータの更新

データ ソースのフィールドの値を更新する必要がある場合は、SQLServerResultSet クラスのいずれかの update<Type> メソッドを使用します。 次の例では、updateInt メソッドを updateRow メソッドと組み合わせて使用し、データ ソース内のデータを更新します。

try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    int empJobID = rs.getInt(2);
    empJobID++;
    rs.first();
    rs.updateInt(2, empJobID);
    rs.updateRow();
}

注意

JDBC ドライバーは、127 文字を超える列名の SQL Server の列を更新できません。 列名が 127 文字を超える列を更新しようとすると、例外がスローされます。

パラメーター化クエリによるデータの更新

パラメーター化クエリを使用してデータ ソースのデータを更新する必要がある場合は、SQLServerPreparedStatement クラスのいずれかの set<Type> メソッドを使用して、パラメーターのデータ型を設定できます。これらは、"setter メソッド" とも呼ばれます。 次の例では、prepareStatement メソッドを使用して、パラメーター化クエリをプリコンパイルし、setString メソッドを使用してパラメーターの文字列値を設定してから、executeUpdate メソッドを呼び出します。

try(PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')");) {
    String name = "Bob";
    pstmt.setString(1, name);
    int rowCount = pstmt.executeUpdate();
}

パラメーター化されたクエリの詳細については、「パラメーターがある SQL ステートメントの使用」を参照してください。

ストアド プロシージャにパラメーターを渡す

入力されたパラメーターをストアド プロシージャに渡す必要がある場合は、SQLServerCallableStatement クラスのいずれかの set<Type> メソッドを使用して、インデックスまたは名前でパラメーターを設定できます。 次の例では、prepareCall メソッドを使用してストアド プロシージャへの呼び出しを設定し、setString メソッドを使用して呼び出し用のパラメーターを設定してから、executeQuery メソッドを呼び出します。

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");) {
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();
}

注意

この例では、結果セットはストアド プロシージャの実行結果で返されます。

JDBC ドライバーでストアド プロシージャと入力パラメーターを使用する方法の詳細については、「入力パラメーターがあるストアド プロシージャの使用」を参照してください。

ストアド プロシージャからのパラメーターの取得

ストアド プロシージャからパラメーターを取得する必要がある場合は、まず SQLServerCallableStatement クラスの registerOutParameter メソッドを使用して名前またはインデックスで out パラメーターを登録し、ストアド プロシージャへの呼び出しを実行してから、返された out パラメーターを適切な変数に割り当てる必要があります。 次の例では、prepareCall メソッドを使用してストアド プロシージャへの呼び出しを設定し、registerOutParameter メソッドを使用して out パラメーターを設定します。次に、setString メソッドを使用して呼び出し用のパラメーターを設定してから、executeQuery メソッドを呼び出します。 ストアド プロシージャの out パラメーターによって返される値は、getShort メソッドを使用して取得します。

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid (?, ?)}");) {
    cstmt.registerOutParameter(2, java.sql.Types.SMALLINT);
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();
    short empJobID = cstmt.getShort(2);
}

注意

out パラメーターが返されるだけでなく、ストアド プロシージャの実行結果により作成された結果セットが返されることもあります。

JDBC ドライバーでストアド プロシージャと出力パラメーターを使用する方法の詳細については、「出力パラメーターがあるストアド プロシージャの使用」を参照してください。

関連項目

JDBC ドライバーのデータ型について