Java Datum - Einfügen in die Datenbank
Ich brauche, um herauszufinden, einen Weg, um einen Datensatz einfügen mit java.util.Date-Feld in einer Datenbank-und ich bin stecken.
Weiß jemand, wie ich dies tun kann?
Jetzt habe ich etwas wie.
java.util.Date myDate = new java.util.Date("01/01/2009");
sb.append("INSERT INTO USERS");
sb.append("(USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE) ");
sb.append("VALUES ( ");
sb.append(" '" + userId + "'");
sb.append(", '" + myUser.GetFirstname() + "' ");
sb.append(", '" + myUser.GetLastname() + "' ");
sb.append(", '" + myUser.GetSex() + "' ");
sb.append(", '" + myDate + "'");
sb.append(")");
Util.executeUpdate(sb.toString());
Aber wenn ich soetwas bekomme ich die Fehlermeldung:
Die syntax der Zeichenfolgendarstellung eines datetime-Wert ist falsch.
Heres, was die sql-Anweisung sieht wie folgt aus:
INSERT INTO USERS (USER_ID
, FIRST_NAME
, LAST_NAME
, SEX
, CRDATE)
VALUES (
'user'
, 'FirstTest'
, 'LastTest'
, 'M'
, 'Thu Jan 01 00:00:00 CST 2009')
Dank
InformationsquelleAutor zSynopsis | 2009-07-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gewährt,
PreparedStatement
wird Ihr code besser, aber um deine Frage zu beantworten, müssen Sie sagen, das DBMS das format der string-Repräsentation von Daten. In Oracle (Sie keine Namen Ihrer Datenbank-Anbieter), ein string-Datum umgewandelt wirdDate
mit derTO_DATE()
Funktion:Ja String s = new " = SimpleDateFormat("dd/MM/yyyy").format( aDate ); tun
Achtung: "= SimpleDateFormat ist nicht Thread-sicher. Machen Sie eine einfache " wrapper von Ihrem eigenen, das ist Thread-sicher. public class ThreadSafeSimpleDateFormat { private DateFormat df; public ThreadSafeSimpleDateFormat(String format) { dieses.df = new " = SimpleDateFormat(format); } public synchronized String format(Date Date) { return df.format(date); } public synchronized Date parse(String) throws ParseException { return df.parse(string); } }
Naja, der code funktioniert nicht format in den Kommentaren :-).
Vielen Dank Brian! Sie habe vry hilfreich. 😀
InformationsquelleAutor Brian
Bevor ich deine Frage beantworte, möchte ich erwähnen, dass sollten Sie sich wahrscheinlich in irgendeine Art von ORM-Lösung (z.B. Hibernate), verpackt hinter einer data access tier. Was Sie tun, zu sein scheinen sehr anti-OO. Ich zwar nicht wissen, was der rest des Codes aussieht, aber im Allgemeinen, wenn Sie anfangen, sehen Sie sich mit einer Menge von Utility-Klassen, sind Sie wahrscheinlich zu strukturellen Ansatz.
Ihre Frage zu beantworten, wie andere erwähnt haben, schauen Sie in
java.sql.PreparedStatement
, und verwenden Siejava.sql.Date
oderjava.sql.Timestamp
. So etwas wie (verwenden Sie Ihre original-code soweit wie möglich, werden Sie wahrscheinlich wollen, um es zu ändern sogar mehr):Einen zusätzlichen Vorteil dieses Ansatzes ist, dass es automatisch entweicht Saiten für Sie (z.B. wenn waren zu legen, jemand mit dem Nachnamen "O ' Brien", Sie hätte Probleme mit Ihrem original-Implementierung).
Leow: Das ist nicht anti-OO, Es kann nur noch eine andere Ebene der OO-Abstraktion. Martin Fowler, erklärt er Brillant in seinem Buch PEAA als Domain Logic Patterns: martinfowler.com/eaaCatalog während einige Systeme können auch hilfreich finden, verwenden TransactionScript ( ziemlich viel, was zSysop verwendet ) für die anderen ist er möglicherweise zu schwer oder gar unmöglich, es zu erhalten und verwenden Sie "Domain-Modell" statt. Für kleine Anwendungen "Domain Model" kann overkill. Es ist sehr Interessantes Thema.
InformationsquelleAutor Jack Leow
PreparedStatement
Sollten Sie auf jeden Fall verwenden Sie eine
PreparedStatement
. (Tutorial)Diese Weise können Sie invoke:
Den JDBC-Treiber tun, die Datum-Zeit-Umgang mit Ihrer jeweiligen Datenbank.
Auch, ein PreparedStatement-Stoppt alle SQL-injection hacking-versuche – sehr wichtig! (humor)
Sollte es so Aussehen:
Und das ist es, JDBC-Treiber und schaffen das richtige SQL-syntax für Sie.
Abrufen
Beim abrufen eines Date-Objekts können Sie ein "=SimpleDateFormat erstellen Sie eine formatierte string-Darstellung von Datum-Uhrzeit-Wert.
Hier ist ein kurzer Beispiel-Zeile, aber die Suche StackOverflow für viele mehr.
setDate
akzeptiert java.sql.Datum und kein java.util.Datum.Danke. Es ist jetzt korrigiert. @zSisop:java.sql.Date und java.sql.TimeStamps sind verschiedene Objekte, wenn Sie möchten, speichern Sie das Datum und die Stunde, sollten Sie die später.
Dies sollte die akzeptierte Antwort. Mit einem
PreparedStatement
heilt das problem der SQL-injection hacking, also es sollten fast immer verwendet werden. Die Verwendung vonjava.sql.Date
anstelle von Zeichenfolgen ist eine bessere Praxis.Ich habe einige signifikante Bearbeitung dieser Antwort, wie der Austausch von veralteten code. Auch Benutzer von Java 8 und später Lesen sollte [meine Antwort] als Nachtrag zu dieser Antwort (die Nutzung von neuen java.time package).
InformationsquelleAutor OscarRyz
Die Antwort von OscarRyz korrekt ist, und sollte die akzeptierte Antwort. Aber nun, die Antwort ist veraltet.
java.Zeit
In Java 8 und höher, haben wir die neue java.Zeit-Paket (inspiriert durch Joda-Time, definiert durch JSR 310, mit tutorial, erweitert durch ThreeTen-Extra Projekt).
Vermeiden Alte Datum-Zeit-Klassen
Dem alten java.util.Datum/.Kalender " = SimpleDateFormat, java.sql.Datum Klassen sind ein Durcheinander. Für eine Sache, j.u.Datum Datum hat und time-of-Tag, während j.s.Datum ist Datum-nur ohne time-of-Tag. Oh, außer, dass j.s.Datum nur vorgibt, um nicht über eine time-of-Tag. Als Unterklasse von j.u.Datum, j.s.Datum erbt die time-of-Tag, sondern passt sich automatisch, Zeit-von-Tag um Mitternacht (
00:00:00.000
). Verwirrend? Ja. Ein schlechter hack, ehrlich gesagt.Für diese und viele Gründe mehr, die alten Klassen sollten vermieden werden, wird nur der Letzte Ausweg. Verwenden Sie java.Zeit, wo möglich, mit Joda-Time als fallback.
LocalDate
In java.Zeit, die
LocalDate
Klasse sauber stellt eine nur-Datum-Wert ohne Uhrzeit oder Zeitzone. Das ist das, was wir brauchen für diese Frage ist die Lösung.Bekommen, LocalDate Objekt, wir analysieren den input-string. Aber anstatt die alte
SimpleDateFormat
- Klasse, java.Zeit bietet eine neueDateTimeFormatter
Klasse in der java.Zeit.format-Paket.JDBC-Treiber kompatibel mit JDBC 4.2 oder später verwenden können, java.Zeit-Typen, die direkt über die
PreparedStatement::setObject
undResultSet::getObject
Methoden.Aber bis du solche eine aktualisierte JDBC-Treiber, fallback auf die Verwendung der java.sql.Datum Klasse. Zum Glück, das alte
java.sql.Date
Klasse geschenkt wurde, die von Java 8 mit einer neuen bequemen, conversion-statische Methode,valueOf( LocalDate )
.In der Beispiel-code von die Geschwister-Antwort von OscarRyz, ersetzen Ihre "sqlDate =" - Zeile mit dieser:
InformationsquelleAutor Basil Bourque
wenn Sie mysql verwenden .. Sie können sparen, das Datum als "2009-12-31" zum Beispiel.
update person set birthday_date = '2009-12-31'
aber ich bevorzuge die Verwendung von jdbc-obwohl Sie zum erstellen von java.sql.Datum ...
*Datum Art des bösen in dieser Welt ... 🙂
InformationsquelleAutor nightingale2k1
Verwenden Sie vorbereitete Anweisungen, die Sie haben Methoden, die richtige Einstellung von Parametern für jede native Java-Typ.
Blick auf die api für setDate und die Beispiele
InformationsquelleAutor fortran
Sollten Sie java verwenden.sql.Timestamp anstelle von java.util.Datum.
Auch die Verwendung eines PreparedStatement sparen Sie sich Gedanken über die Formatierung.
InformationsquelleAutor objects
dies ist der code, den ich verwendet, um zu speichern das Datum in der Datenbank mit jdbc funktioniert gut für mich
pst
ist eine variable für preparedstatementtxtdate
ist der name für den JDateChooserInformationsquelleAutor user3629370
können Sie diesen code verwenden, Datum und Zeit, 24 h
InformationsquelleAutor Madhuka Dilhan
Können Sie es verwenden, um Variablen einfügen in die sql-Abfrage.
InformationsquelleAutor Nugroho Prayogo