質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

7816閲覧

エンティティでjava.sql.Date型を利用することは、あるのでしょうか

nvOSji1879

総合スコア2

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/09/07 12:07

編集2021/09/07 12:09

前提・実現したいこと

Spring BootでJPAを利用し、DBへアクセスしデータを取得したいのですが、下記サイトのソースコードを参照しているときに疑問に思いました。(https://qiita.com/opengl-8080/items/265f9f66a65e966678cb)
private Date date変数は、java.util.Date型ですが、DBからデータを取得する際にjava.sql.Date型ではないのにも関わらず、SQLのDATE型のデータが格納されるのはなぜでしょうか。
下記URLによると、SQL のDATEデータ型は、Javaのjava.sql.Date型とマッピングされるようです。
https://docs.oracle.com/javase/jp/1.3/guide/jdbc/spec/jdbc-spec.frame8.html)
エンティティにデータを格納するときに自動でjava.sql.Date→java.util.Date型に変換されるのでしょうか。
また以下のURLの結論によるとjava.sql.Dateは、「JDBCで一般的に使用されます。」とのことですが、SpringでJPAを使用しDBにアクセスする場合は、エンティティにjava.sql.Dateは使用しないのでしょうか。
(https://www.baeldung.com/java-util-date-sql-date)
java.util.Dateの利用が一般的であれば、java.sql.Date→java.util.Dateへの変換処理を書かずに済むのでそうしたいのですが、java.sql.Dateを利用するメリットは、存在するのでしょうか。

長くなりましたが、以上よろしくお願いいたします。

該当のソースコード

Java

1package sample.javaee.jpa.entity.mapping; 2 3import java.util.Date; 4import javax.persistence.Entity; 5import javax.persistence.GeneratedValue; 6import javax.persistence.GenerationType; 7import javax.persistence.Id; 8import javax.persistence.Temporal; 9import javax.persistence.TemporalType; 10 11@Entity 12public class Kikuri { 13 14 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 15 private Long id; 16 17 @Temporal(TemporalType.DATE) 18 private Date date; 19 @Temporal(TemporalType.TIME) 20 private Date time; 21 @Temporal(TemporalType.TIMESTAMP) 22 private Date datetime; 23 24 public void setDate(Date date) { 25 this.date = this.time = this.datetime = date; 26 } 27}

補足情報(FW/ツールのバージョンなど)

DB:PostgreSQL
DB接続:JDBCドライバー

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

private Date date変数は、java.util.Date型ですが、DBからデータを取得する際にjava.sql.Date型ではないのにも関わらず、SQLのDATE型のデータが格納されるのはなぜでしょうか。

java.util.Dataまたはjava.util.Calender型のプロパティに@Temporalアノテーションを付与するとjava.sql.Dateから自動変換しますよ、というのがJPAの仕様だからです。仕様なのでJPAプロバイダ(SpringBootだとHibernate)がそれに従った実装を提供しているだけです。

java.sql.Dateを利用するメリットは、存在するのでしょうか。

特にないです。日付系の処理は

  • Java7まで java.util.Dataまたはjava.util.Calender
  • Java8以降 java.time.*

を使うのが一般的です。

なお、JPA2.2からは@Temporalアノテーションを指定しなくてもjava.time.LocalDatejava.time.LocalDateTimeに変換してくれるので、こっちを使う方オススメです。
※最新のSpringBootであればJPA2.2です

java

1@Entity 2public class Kikuri { 3 4 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 5 private Long id; 6 7 private LocalDate date; 8 9 private LocalTime time; 10 11 private LocalDateTime datetime; 12 13 // getter, setter 14}

参考: https://www.baeldung.com/jpa-java-time

投稿2021/09/07 19:11

sooogle

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nvOSji1879

2021/09/14 13:25

>java.util.Dataまたはjava.util.Calender型のプロパティに@Temporalアノテーションを付与すると>java.sql.Dateから自動変換しますよ、というのがJPAの仕様だからです。 >仕様なのでJPAプロバイダ(SpringBootだとHibernate)がそれに従った実装を提供しているだけです。 詳細な解説ありがとうございます。 >日付系の処理は >Java7まで java.util.Dataまたはjava.util.Calender >Java8以降 java.time.*系 >を使うのが一般的です。 実装する際は、 java.time.*を使用して実装しようと思います。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問