Microsoft JDBC Driver for SQL Server では、SQL Server データ型を Java プログラミング言語が認識する形式に変換する (およびその逆を行う) ために、JDBC 基本データ型が使用されます。 JDBC ドライバー は SQLXML データ型を含む JDBC 4.0 api および NCHAR、 NVARCHAR、 LONGNVARCHAR、そして 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 |
| 10 進 | DECIMAL | java.math.BigDecimal |
| float | DOUBLE | double |
| geometry | VARBINARY | byte[] |
| geography | VARBINARY | byte[] |
| イメージ | LONGVARBINARY | byte[] |
| INT | INTEGER | INT |
| JSON | microsoft.sql.Types.JSON | String |
| 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 |
| sqlvariant | microsoft.sql.Types.SQL_VARIANT | Object |
| SMS 送信 | 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 |
| ベクタ | microsoft.sql.Types.VECTOR | microsoft.sql.Vector |
| xml | LONGVARCHAR LONGNVARCHAR (Java SE 6.0) |
String SQLXML |
1 時刻の SQL Server データ型を持つ java.sql.Time を使用する場合は、sendTimeAsDatetime 接続プロパティを false に設定します。
2DateTimeOffset Class で datetimeoffset の値にプログラムでアクセスできます。
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 と scale メソッドは非推奨となり、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 文字を超える列を更新しようとすると、例外がスローされます。
パラメーター化クエリによるデータの更新
パラメーター化クエリを使用してデータ ソースのデータを更新する場合は、< クラスのいずれかの 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 ステートメントの使用」を参照してください。
ストアド プロシージャにパラメーターを渡す
入力されたパラメーターをストアド プロシージャに渡す必要がある場合は、< クラスのいずれかの 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 を使用すると、潜在的な値の切り捨てが回避されます。 または、接続文字列オプション calcBigDecimalPrecision が true に設定されている場合、ドライバーは、パフォーマンスを犠牲にして、ユーザーに代わって BigDecimal 入力の精度を計算します。
calcBigDecimalPrecision 設定なし、または false へのオプション設定で、値が単独で渡される場合、ドライバーは、その BigDecimal 値の有効桁数の最大値 (38) を想定します。
JDBC ドライバーでストアド プロシージャと入力パラメーターを使用する方法の詳細については、「入力パラメーターがあるストアド プロシージャの使用」を参照してください。
ストアド プロシージャからのパラメーターの取得
ストアド プロシージャからパラメーターを取得する必要がある場合は、まず SQLServerCallableStatement クラスの 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 ドライバーでストアド プロシージャと出力パラメーターを使用する方法の詳細については、「出力パラメーターがあるストアド プロシージャの使用」を参照してください。