sql >> Databáze >  >> RDS >> Mysql

JPA Ukládání nesprávného data do databáze MySQL

tl;dr

Použít JPA 2.2 za podporu java.time .

Pro práci s hodnotami pouze pro datum v SQL použijte v jazyce Java třídu pouze pro datum.

LocalDate                           // Represent a date-only, without a time-of-day and without a time zone.
.now(                               // Get today's date…
    ZoneId.of( "Africa/Tunis" )     // …as seen in the wall-clock time used by the people of a particular region.
)                                   // Returns a `LocalDate` object.
.plusMonths( 1 )                    // Returns another `LocalDate` object, per immutable objects pattern.

java.time

JPA 2.2 nyní podporuje moderní java.time třídy. Již není třeba používat Joda-Time.

Ne ne použijte java.sql.Date . Tato třída předstírá reprezentovat pouze datum, ale ve skutečnosti má denní dobu nastavenou na UTC kvůli hroznému rozhodnutí o návrhu dědit z java.util.Date (který navzdory názvu představuje datum a denní dobu a offset nuly pro samotné UTC). Tyto starší třídy jsou hrozný ubohý nepořádek. Sun, Oracle a komunita JCP se vzdali kurzů diplomových prací před lety s přijetím JSR 310 a vy byste také měli.

LocalDate

LocalDate class představuje hodnotu pouze pro datum bez času dne a bez časového pásma nebo offset-from-UTC .

Časové pásmo je rozhodující pro určení data. Pro každý daný okamžik se datum na zeměkouli liší podle zóny. Například několik minut po půlnoci v Paříž ve Francii je nový den a přitom ještě „včera“ v Montréal Québec .

Pokud není zadáno žádné časové pásmo, JVM implicitně použije své aktuální výchozí časové pásmo. Toto výchozí nastavení může změnit kdykoli během běhu(!), takže vaše výsledky se mohou lišit. Je lepší zadat požadované/očekávané časové pásmo explicitně jako argument. Pokud je to kritické, potvrďte zónu u svého uživatele.

Zadejte správný název časového pásma ve formátu Continent/Region , jako je America/Montreal , Africa/Casablanca nebo Pacific/Auckland . Nikdy nepoužívejte 2-4písmennou zkratku jako EST nebo IST protože nejsou skutečná časová pásma, nestandardizovaná a dokonce ani jedinečná(!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

Pokud chcete použít aktuální výchozí časové pásmo JVM, požádejte o něj a předejte jej jako argument. Pokud je vynechán, kód se čte nejednoznačně, takže s jistotou nevíme, zda jste zamýšleli použít výchozí nastavení, nebo zda jste, jako mnoho programátorů, o problému nevěděli.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Nebo uveďte datum. Měsíc můžete nastavit číslem, s rozumným číslováním 1-12 pro leden až prosinec.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Nebo, lépe, použijte Month enum objekty předdefinované, jeden pro každý měsíc v roce. Tip:Použijte tyto Month objekty v celé vaší kódové základně spíše než pouhé celé číslo, aby se váš kód více sám dokumentoval, zajistil platné hodnoty a poskytl typová bezpečnost . Stejně jako pro Year &YearMonth .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Matematika data a času

Zřejmě chcete začít s jedním datem a získat o měsíc později jako časové období.

LocalDate monthLater = ld.plusMonths( 1 ) ;

JDBC 4.2

Od verze JDBC 4.2 musí váš ovladač JDBC podporovat některé z klíčů java.time třídy, jako je LocalDate .

Časové období

Všimněte si níže uvedených odkazů pro ThreeTen-Extra . Můžete najít LocalDateRange třída, která se vám bude hodit, pokud hodně pracujete s rozsahy dat.

O java.time

java.time framework je zabudován do Javy 8 a novější. Tyto třídy nahrazují staré problematické dědictví třídy podle data a času, jako je java.util.Date , Calendar , &SimpleDateFormat .

Další informace naleznete v Výukovém programu Oracle . A hledejte Stack Overflow pro mnoho příkladů a vysvětlení. Specifikace je JSR 310 .

Čas Joda projekt, nyní v režimu údržby , doporučuje migraci na java.time třídy.

Můžete si vyměnit java.time objektů přímo s vaší databází. Použijte ovladač JDBC v souladu s JDBC 4.2 nebo později. Není potřeba řetězců, není potřeba java.sql.* třídy.

Kde získat třídy java.time?

The ThreeTen-Extra projekt rozšiřuje java.time o další třídy. Tento projekt je zkušební půdou pro možná budoucí rozšíření java.time. Zde můžete najít některé užitečné třídy, jako je Interval , YearWeek , YearQuarter a další .



  1. Jak QUOTE() funguje v MariaDB

  2. Mysql dotaz GROUP by a ORDER by

  3. jaký má smysl serializovat pole pro jejich uložení do db?

  4. Porovnání řetězců s rozlišením velkých a malých písmen