기본 데이터 형식 사용

JDBC 드라이버 다운로드

Microsoft JDBC Driver for SQL Server는 JDBC 기본 데이터 형식을 사용하여 SQL Server 데이터 형식을 Java 프로그래밍 언어에서 이해할 수 있는 형식으로 변환하며, 그 반대로도 변환합니다. JDBC 드라이버는 SQLXML 데이터 형식과 NCHAR, NVARCHAR, LONGNVARCHAR, NCLOB 등의 국가(유니코드) 데이터 형식을 포함하는 JDBC 4.0 API를 지원합니다.

데이터 형식 매핑

다음 표에서는 기본 SQL Server, JDBC, Java 프로그래밍 언어 데이터 형식 간의 기본 매핑을 나열합니다.

SQL Server 형식 JDBC 형식(java.sql.Types) Java 언어 형식
bigint BIGINT long
binary BINARY byte[]
bit BIT 부울 값
char CHAR 문자열
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
이미지 LONGVARBINARY byte[]
int INTEGER int
money DECIMAL java.math.BigDecimal
nchar CHAR

NCHAR(Java SE 6.0)
문자열
ntext LONGVARCHAR

LONGNVARCHAR(Java SE 6.0)
문자열
numeric NUMERIC java.math.BigDecimal
nvarchar VARCHAR

NVARCHAR(Java SE 6.0)
문자열
nvarchar(max) VARCHAR

NVARCHAR(Java SE 6.0)
문자열
real REAL float
smalldatetime timestamp java.sql.timestamp
smallint SMALLINT short
smallmoney DECIMAL java.math.BigDecimal
text LONGVARCHAR 문자열
시간 TIME1 java.sql.Time1
timestamp BINARY byte[]
tinyint TINYINT short
udt VARBINARY byte[]
uniqueidentifier CHAR 문자열
varbinary VARBINARY byte[]
varbinary(max) VARBINARY byte[]
varchar VARCHAR 문자열
varchar(max) VARCHAR 문자열
xml LONGVARCHAR

LONGNVARCHAR(Java SE 6.0)
문자열

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

1 time SQL Server 형식과 함께 java.sql.Time을 사용하려면 sendTimeAsDatetime 연결 속성을 false로 설정해야 합니다.

2DateTimeOffset 클래스를 사용하여 datetimeoffset 값에 프로그래밍 방식으로 액세스할 수 있습니다.

3 SQL Server 2016부터는 java.sql.Timestamp 값을 사용하여 datetime 열의 값을 비교할 수 없습니다. 이 제한은 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");
}

참고 항목

scale 메서드를 사용하는 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 클래스의 <Type> 메서드 중 하나를 사용하여 인덱스 또는 이름으로 매개 변수를 설정합니다. 다음 예제에서는 prepareCall 메서드를 사용하여 저장 프로시저에 대한 호출을 설정한 다음 setString 메서드를 사용하여 executeQuery 메서드가 호출되기 전에 호출에 대한 매개 변수를 설정합니다.

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

참고 항목

이 예제에서는 저장 프로시저를 실행한 결과와 함께 결과 집합이 반환됩니다.

BigDecimal

BigDecimal 매개 변수 값을 사용하는 경우 setBigDecimal을 통해 값과 함께 전체 자릿수 및 소수 자릿수가 전달될 수 있습니다. setBigDecimal을 이러한 방법으로 사용하면 값이 잘릴 가능성을 방지할 수 있습니다. 또는 연결 문자열 옵션 calcBigDecimalPrecisiontrue로 설정된 경우, 드라이버에서는 성능을 들여 사용자 대신 BigDecimal 입력의 소수 자릿수를 계산합니다. calcBigDecimalPrecision 설정 없이 값을 단독으로 전달하거나 옵션을 false로 설정한 경우, 드라이버는 해당 BigDecimal 값의 전체 자릿수에 허용되는 최댓값(38)을 가정합니다.

저장 프로시저 및 입력 매개 변수와 함께 JDBC 드라이버를 사용하는 방법은 입력 매개 변수가 있는 저장 프로시저 사용을 참조하십시오.

저장 프로시저에서 매개 변수 검색

저장 프로시저에서 매개 변수를 다시 검색해야 하는 경우 먼저 SQLServerCallableStatement 클래스의 registerOutParameter 메서드를 사용하여 이름 또는 인덱스로 out 매개 변수를 등록해야 합니다. 그런 다음 저장 프로시저에 호출을 실행한 후 반환된 매개 변수를 적절한 변수에 할당합니다. 다음 예제에서는 prepareCall 메서드를 사용하여 저장 프로시저에 대한 호출을 설정한 다음 registerOutParameter 메서드를 사용하여 out 매개 변수를 설정하고, executeQuery 메서드가 호출되기 전에 호출에 대한 매개 변수를 설정하기 위해 setString 메서드를 사용합니다. 저장 프로시저의 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);
}

참고 항목

반환된 매개 변수 외에도 저장 프로시저 실행 결과와 함께 결과 집합이 반환될 수도 있습니다.

저장 프로시저 및 출력 매개 변수와 함께 JDBC 드라이버를 사용하는 방법은 매개 변수가 있는 저장 프로시저 사용을 참조하십시오.

참고 항목

JDBC 드라이버 데이터 형식 이해