Choisir entre java.util.Date ou java.sql.Date
Dois-je utiliser java.util.Date ou java.sql.Date?
J'ai un VisualFox base de données et j'ai récupéré les entités avec l'IntelliJ Idea assistant à l'aide d'un idéal jdbc de type 4 de pilote.
L'ide (ou le conducteur) a créé la date de champs d'Horodatage. Cependant, les champs de date ne sont pas des horodateurs, mais les champs de Date, ils stockent de l'année, le mois et le jour seulement.
Donc je me demande si je devrais passer à java.util.Date ou java.sql.Date. Au premier coup d'oeil j'ai pensé que java.sql.La Date devrait être le cas, mais il a de nombreuses méthodes déclarées comme obsolète.
source d'informationauteur Carlos Goce
Vous devez vous connecter pour publier un commentaire.
tl;dr
Ni.
Les deux sont obsolètes comme de JDBC 4.2 et versions ultérieures. Utilisation java.temps classes à la place.
Pour un type de base de données s'apparente à SQL standard
DATE
utilisezjava.time.LocalDate
.LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
myPreparedStatement.setObject( ld , … ) ;
Pour un type de base de données s'apparente à SQL standard
TIMESTAMP
utilisezjava.time.Instant
.Instant instant = myResultSet.getObject( … , Instant.class ) ;
myPreparedStatement.setObject( instant , … ) ;
Détails
La question et d'autres réponses semblent de plus en plus de penser que la question. Un java.sql.Date est simplement un java.util.Date avec son temps de jeu à
00:00:00
.De la java.sql.Date doc (le texte en italique est de moi)...
Date Seule et de Date-Heure
Le cœur du problème est:
En SQL, la
DATE
type de données stocke une date seule, sans un moment de la journée.Dans le mal conçu date-time library fourni avec les premières versions de Java, ils ont omis d'inclure une classe pour représenter une date uniquement.
Au lieu de créer une date en salle de classe, l'équipe Java fait un terrible hack. Ils ont pris leur date-heure de classe (la mal nommée
java.util.Date
classe, contenant à la fois la date et temps) et l'a étendue à avoir un jeu d'instances de son temps de jour à minuit UTC00:00:00
. Ce hack, que sous-classe de j.u.Date, estjava.sql.Date
.Tout ce piratage, une mauvaise conception, et misnaming a fait un mélange confus.
Pour L'Utiliser
Donc à utiliser? Simple, après la coupe à travers la confusion.
java.sql.Date
qu'il tente maladroitement de masquer son temps de la journée.java.util.Date
.Encore Mieux
Moderne, Java, vous avez maintenant un choix décent date-heure bibliothèques à supplanter l'ancienne et connue pour être gênants java.util.La Date, le Calendrier, les SimpleTextFormat, et java.sql.Date de classes livré avec Java. Les principales options sont les suivantes:
(inspiré par Joda-Timedéfini par JSR 310livré avec Java 8prolongée par la ThreeTen-Extra projet)
Les deux offrent une
LocalDate
classe pour représenter une date uniquement, avec des pas de temps de la journée et pas de temps horaire.Un Pilote JDBC mis à jour à JDBC 4.2 ou version ultérieure peut être utilisé pour échanger directement des java.temps objets avec la base de données. Ensuite, nous pouvons abandonner complètement l'affreux désordre qui est la date-heure de classes java.util.* et java.sql.* les packages.
setObject | getObject
Cet article publié par Oracle explique que le JDBC Java 8 a été mis à jour de façon transparente pour la carte d'un SQL
DATE
de la valeur à la java.temps.LocalDate type si vous appelezgetObject
etsetObject
méthodes.Dans obtus de la langue, le fond de la JDBC 4.2 mise à jour spec confirme que l'article, avec de nouveaux mappages ajouté à la
getObject
etsetObject
méthodes....et...
Convertir
La spec dit aussi de nouvelles méthodes ont été ajoutées à la java.sql.Classe Date à convertir et en arrière pour java.temps.LocalDate.
public java.temps.instant toInstant()
public java.temps.LocalDate toLocalDate()
public static java.sql.Date valueOf(java.temps.LocalDate)
Fuseau Horaire
L'ancien
java.util.Date
java.sql.Date
etjava.sql.Timestamp
sont toujours en UTC. Les deux premiers (au moins) ont un horaire enfoui au plus profond dans leur code source mais il est utilisé uniquement sous la surface comme leequals
méthode, et n'a pas de getter/setter.Plus de prêter à confusion, leur
toString
méthodes s'appliquent de la JVM par défaut en cours de fuseau horaire. Donc, pour les naïfs programmeur c' semble comme ils ont un fuseau horaire, mais ils ne le font pas.À la fois enterré le fuseau horaire et le
toString
comportement sont que deux des nombreuses raisons pour éviter ces pénibles ancien héritage de classes.Écrire votre logique métier à l'aide de java.le temps (Java 8 et les versions ultérieures). Où java.le temps manque, utilisez Joda-Time. Les deux java.temps et Joda-Time ont des méthodes pratiques de va-et-vient avec les anciennes classes où besoin sera.
De la hanche:
java.util.Date
est remplacé parjava.temps.Instantané
java.sql.Timestamp
est remplacé parjava.temps.Instantané
java.sql.Date
est remplacé parjava.temps.LocalDate
.java.sql.Temps
est remplacé parjava.temps.LocalTime
.La
Instantané
classe représente un moment dans le scénario de UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).Tous les trois
java.time.Local…
classes sont tous dépourvus de toute notion de fuseau horaire ou offset-de-UTC.Sur java.temps
La java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
Agenda
&SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenanceconseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un Pilote JDBC compatible avec JDBC 4.2 ou plus tard. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
YearWeek
YearQuarter
et plus.En général, je trouve qu'il est souhaitable d'utiliser la
java.util.Date
car vous pouvez l'utiliser n'importe où dans votre programme sans qu'il soit en convertissant le type ou polluantes de votre application avec SQL-code spécifique.Je ne suis pas au courant d'un scénario où " java.sql.Date " serait un meilleur ajustement.
Bien, selon cette l'article vous pouvez utiliser
javax.sql.Date
sans@Temporal
annotation qui peut sauver certains de codage à partir de vous. Cependantjava.util.Date
est plus facile à utiliser dans l'ensemble de votre application.Je voudrais donc utiliser
Selon la Java doc, il est suggéré l'utilisation appropriée de type Date comme par sous-jacent de la base de données.
Cependant, avec Java 8, un riche ensemble de classes en java.package ont été fournis, et il doit être utilisé, si la demande est écrite avec Java 8.
La classe javaxjava.sql.Date étend java.util.Date avec des modifications mineures pour milisecondes récipient de sorte qu'il peut prendre en charge la Base de données de type DATE efficacement. Cela, nous pouvons économiser de l' @annotation Temporelle de la frappe à partir de l'entité de la classe.
Cependant, java.util.Date pourrait être utilisé pour une meilleure évolutivité dans l'ensemble de l'application, de sorte qu'il peut être facilement utilisé pour stocker le temps de date.