Pourquoi ne pas utiliser java.util.Date dans Jdbc?
C'est une simple question: je sais et j'ai entendu parler de presque tout le monde que l'utilisation de java.util.Date
pour rien dans Jdbc appel est une mauvaise idée. Vous devez utiliser java.sql.Date
ou java.sql.Time
ou java.sql.Timestamp
. Cependant, quelle est la raison de ne pas le faire? Je ne peux pas trouver un bon billet de blog ou DONC, après l'expliquer, sauf que parfois, les gens voir "comportement bizarre".
Merci!
MODIFIER:
Si, j'ai vu ce post. Ouais, la seule partie de ce post, ce genre de réponses, ma question est
...pour la plupart des pilotes JDBC qui seront heureux de vous dévorer, comme si c'était de
le type est correct mais quand vous demandez les données par la suite, vous pouvez
notez que vous êtes réellement en manque des trucs.
Cependant, ce n'est pas vraiment de réponse pourquoi.
source d'informationauteur daveslab
Vous devez vous connecter pour publier un commentaire.
Bon, alors après avoir lu toutes les informations à travers les réponses, et les autres postes souligné dans les commentaires, et ainsi de suite, j'ai décidé de résumer ce que j'ai appris:
De La Configuration:
De ce que je peux voir, il ya trois couches
La Première Raison
Beaucoup de classe JDBC wrappers, comme le Printemps est célèbre
SimpleJdbcTemplate
vous a permis de vous donner unMap<String, Object>
que l'argument de la carte lors de l'exécution d'une instruction SQL. C'est merveilleusement simple, comme il les mains de tous les conversions à partir des objets à la bonnejava.sql.*
types quand il utilise des raw JDBC sous le capot. Le premier problème est là: ce qui arrive si vous avez le suivant:Ce n'Printemps convertir? Un
java.sql.Date
? Unjava.sql.Timestamp
? Unjava.sql.Time
? Ou c'est aussi la convertir en unejava.lang.Object
? Comme bien expliqué par @BalusC dans cette réponse à une autre question et par un autre camarade iciil existe de grandes différences entre ces troisjava.sql
types. Donc, c'est la première raison de ne pas utiliserjava.util.Date
: vous ne pouvez pas compter sur la convention interne d'un cadre pour gérer la conversion pour vous.La Deuxième Raison
Maintenant, parler de raw appels JDBC, @Le Clou expliqué que vous besoin ces
java.sql
types de faire des appels JDBC, et il a tout à fait le droitqui a des nouvelles de moi. Cependant, il ya encore la redoutablesetObject
appel. À la lecture de la JavaDoc pour cet appelil semble un peu ambigu à ce qu'il faut faire si donner unjava.util.Date
. Ainsi, la deuxième raison de ne pas l'utiliser c'est à cause de l'ambiguïté.La Troisième Raison
Enfin, de parler du niveau du pilote. Je peux attester avec l'expérience personnelle que, parfois, le Printemps en collaboration avec le pilote Oracle fonctionne avec
java.util.Date
. Parfois. Et puis parfois ça ne marche pas. Ainsi, parce que je n'ai aucune idée de la façon dont une nouvelle version d'un pilote va gérer unjava.util.Date
il est préférable d'être explicite. C'est le troisième raison.Conclusion
En général, il semble que la raison est la suivante: "JDBC n'est pas censé être utilisé avec
java.util.Date
. Si vous le faites, vous ne pouvez pas être sûr de ce qui va arriver." C'est une assez bonne raison pour moi 🙂java.sql.Timestamp
C'est le niveau de précision de l'horodatage (comme prévu par la DB) qu'elle peut contenir de vs
java.util.Date
.Supposons que, si nous utilisons un
java.util.Date
objet pour représenter une valeur d'horodatage en DB, la valeur représentée par l'objet ne représentent pas la même valeur (comme dans la bd), parce qu'il ne peut pas tenir que les "fractions de secondes avec une précision de nanosecondes".Comme pour
Date
c'est assez simple:PreparedStatement.setDate
nécessite unjava.sql.Date
pas unjava.util.Date
.Vous pouvez convertir
java.util.Date
àjava.sql.Date
comme suit:représente un général Valeur de type DateTime.Fondamentalement, un Type Java.
est Spécifique pour le mappage Objet Java modèle d'objet Type de données SQL qui est de Données SQL. Sql (Type de pas Type Java).