基本データ型の使用

JDBC ドライバーのダウンロード

Microsoft JDBC Driver for SQL Server では、SQL Server データ型を Java プログラミング言語が認識する形式に変換する (およびその逆を行う) ために、JDBC 基本データ型が使用されます。 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 に設定します。

2DateTimeOffset 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");
}

Note

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();
}

Note

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

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

パラメーター化クエリを使用してデータ ソースのデータを更新する場合は、SQLServerPreparedStatement クラスのいずれかの set<Type> メソッドを使用して、パラメーターのデータ型を設定できます。 これらのメソッドはセッター メソッドとも呼ばれます。 次の例では、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();
}

Note

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

BigDecimal

BigDecimal パラメーター値を使用している場合は、setBigDecimal を通じて有効桁数と小数点以下桁数を値とともに渡すことができます。 このように setBigDecimal を使用すると、潜在的な値の切り捨てが回避されます。 または、接続文字列 オプション calcBigDecimalPrecisiontrue に設定されている場合、ドライバーは、パフォーマンスを犠牲にして、ユーザーの代わりに BigDecimal 入力の精度を計算します。 calcBigDecimalPrecision 設定なし、または false へのオプション設定で、値が単独で渡される場合、ドライバーは、その BigDecimal 値の有効桁数の最大値 (38) を想定します。

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);
}

Note

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

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

関連項目

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