문제
어떻게 할 수 있나요? JDBC를 사용하여 LocalDate와 같은 java.time 유형을 H2와 같은 SQL 데이터베이스에 삽입하고 검색합니까? preparedStatement::setDate 및 ResultSet::getDate를 사용하는 이전 방법은 레거시 java.sql.Date 유형에 대해 작동하지만 이러한 번거로운 이전 날짜-시간 클래스를 사용하지 않으려고 합니다. JDBC 드라이버를 통해 java.time 유형을 전송하는 현대적인 방법은 무엇입니까?
솔루션
JDBC를 통해 java.time 객체를 교환하는 방법에는 두 가지가 있습니다.
java.util.Date, java.util.Calendar와 같은 레거시 날짜-시간 클래스 및 java와 같은 관련 java.sql 클래스. sql.Date는 결함이 있고 해킹된 접근 방식으로 설계되었기 때문에 문제가 있는 것으로 악명 높습니다. 오류가 발생하기 쉽고, 까다롭고, 혼란스럽습니다. 이제 java.time 클래스로 대체되었으므로 가능하면 이를 피하십시오.
JDBC 4.2 호환 드라이버 사용
내장 H2 JDBC 드라이버(현재) 2017-03)은 JDBC 4.2를 준수하는 것으로 보입니다. 호환 드라이버는 java.time 유형을 인식합니다. JDBC 위원회는 setLocalDate/getLocalDate 메소드를 추가하는 대신 setObject/getObject 메소드를 추가했습니다.
데이터베이스에 데이터를 보내려면 java.time 객체를 preparedStatement::setObject에 전달하기만 하면 됩니다. 전달된 인수의 Java 유형은 드라이버에 의해 감지되어 적절한 SQL 유형으로 변환됩니다. java.time.LocalDate는 SQL DATE 유형으로 변환됩니다. 이러한 매핑 목록은 JDBC Maintenance Release 4.2 PDF 문서의 섹션 22를 참조하세요.
myPreparedStatement.setObject(1, myLocalDate); // Automatic detection and conversion of data type.
데이터베이스에서 데이터를 검색하려면 ResultSet::getObject를 호출하세요. 결과 Object 객체를 캐스팅하는 대신 수신할 것으로 예상되는 데이터 유형의 클래스를 지정하는 추가 인수를 제공할 수 있습니다. 예상되는 클래스를 명시적으로 지정하면 IDE와 컴파일러에서 확인 및 검증되는 유형 안전성을 얻을 수 있습니다.
LocalDate localDate = myResultSet.getObject("my_date_column_", LocalDate.class);
코드 예:
다음은 다음과 같습니다. LocalDate 값을 H2 데이터베이스에 삽입하고 선택하는 앱의 완전한 작동 예:
import java.sql.*; import java.time.LocalDate; import java.time.ZoneId; import java.util.UUID; public class App { public static void main ( String[] args ) { App app = new App ( ); app.doIt ( ); } private void doIt ( ) { try { Class.forName ( "org.h2.Driver" ); } catch ( ClassNotFoundException e ) { e.printStackTrace ( ); } try ( Connection conn = DriverManager.getConnection ( "jdbc:h2:mem:trash_me_db_" ) ; Statement stmt = conn.createStatement ( ) ; ) { String tableName = "test_"; String sql = "CREATE TABLE " + tableName + " (\n" + " id_ UUID DEFAULT random_uuid() PRIMARY KEY ,\n" + " date_ DATE NOT NULL\n" + ");"; stmt.execute ( sql ); // Insert row. sql = "INSERT INTO test_ ( date_ ) " + "VALUES (?) ;"; try ( PreparedStatement preparedStatement = conn.prepareStatement ( sql ) ; ) { LocalDate today = LocalDate.now ( ZoneId.of ( "America/Montreal" ) );
위 내용은 JDBC를 사용하여 H2 데이터베이스에서 java.time.LocalDate 객체를 삽입하고 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!