Flexibler Datentypkonvertierungsmechanismus der O / R-Zuordnungsbibliothek Lightsleep für Java 8

In Bezug auf Lightsleep habe ich einen Einführungsartikel über Qiita veröffentlicht, siehe unten.

Einführung in Lightsleep, eine O / R-Zuordnungsbibliothek, die nur mit Java Runtime- und JDBC-Treibern funktioniert

Lightsleep verfügt über einen Mechanismus zur flexiblen Datentypkonvertierung, der intern verwendet wird. Es ist nicht unbedingt erforderlich, die Details der Verwendung von Lightsleep zu kennen, aber es ist hilfreich zu wissen, wie die Konvertierung aussehen wird.

Verwendung der Datentypkonvertierung

Es wird hauptsächlich an den folgenden zwei Stellen verwendet.

  1. Wo werden Eigenschaftswerte von Entitätsobjekten in Literalzeichenfolgen konvertiert, um SQL zu generieren? Zum Beispiel

    • "Yukari's apples"'Yukari''s apples'
    • 2017/2/12 (java.sql.Date) ➔ DATE'2017-02-17'
  2. Wo soll der von DB erhaltene Wert im Entitätsobjekt festgelegt werden? Zum Beispiel --BigDecimal ➔ Integer (Spaltentyp ist NUMBER (9) / Oracle) --Long ➔ java.sql.Date (Spaltentyp ist BIGINT)

Die obigen 2 sind der ursprüngliche Zweck der Datentypkonvertierung, sodass sie gespeichert werden können, auch wenn der zu speichernde Wert und der Typ der zu speichernden Variablen unterschiedlich sind.

1 verwendet diesen Mechanismus, um SQL-Literalzeichenfolgen zu generieren. Da sich der Konvertierungsinhalt von einer normalen Zeichenfolge unterscheidet, ist der Konvertierungszieldatentyp die SqlString-Klasse. Durch eine Datentypkonvertierungszuordnung für jeden Datenbankhandler ist es möglich, DBMS-spezifisches SQL zu generieren.

Klasse, die die Datentypkonvertierung durchführt

org.lightsleep.helper.TypeConverter ist eine Klasse, die eine Datentypkonvertierung durchführt. Wenn Sie Lightsleep verwenden, ist es meiner Meinung nach nicht üblich, diese Klasse direkt zu verwenden, aber ich werde es kurz erklären.

Diese Klasse hat zwei Konstruktoren:

  1. TypeConverter(Class<ST> sourceType, Class<DT> destinType, Function<ST, DT> function)
  2. <MT> TypeConverter(TypeConverter<ST, MT> typeConverter1, TypeConverter<MT, DT> typeConverter2)

Die Argumente von Konstruktor 1 sind der Quelldatentyp (sourceType), der Zieldatentyp (destinType) und das Funktionsobjekt (function), um die Konvertierung durchzuführen. Funktion wird durch einen Lambda-Ausdruck beschrieben.

java:Long->java.sql.Date


    new TypeConverter<>(Long.class, Date.class, object -> new Date(object))

Die Argumente für Konstruktor 2 sind zwei weitere TypeConverter-Objekte.

java:java.util.Date->Integer


    new TypeConverter<>(
        TypeConverter.get(typeConverterMap, java.util.Date.class, Long.class),
        TypeConverter.get(typeConverterMap, Long.class, Integer.class)
    )

Die statische TypeConverter.get-Methode im obigen Beispiel ist eine Methode, um das TypeConverter-Objekt in der Map zu registrieren. Das Funktionsobjekt dieses TypeConverter-Objekts ist typeConverter1.function.andThen (typeConverter2.function) `(zusammengesetzte Funktion).

Da für das TypeConverter-Objekt ein Schlüssel aus dem Datentyp der Konvertierungsquelle und dem Datentyp des Konvertierungsziels generiert wird, verwenden Sie bei der Registrierung der Karte die Methode "static TypeConverter # put" anstelle von "Map # put".

java:Long->java.sql.Date


TypeConverter.put(typeConverterMap,
    new TypeConverter<>(Long.class, Date.class, object -> new Date(object))
);

java:java.util.Date->Integer


TypeConverter.put(typeConverterMap,
    new TypeConverter<>(
        TypeConverter.get(typeConverterMap, java.util.Date.class, Long.class),
        TypeConverter.get(typeConverterMap, Long.class, Integer.class)
    )
);

Der Datentypkonvertierungsprozess wird mit der statischen TypeConverter # convert-Methode ausgeführt. Diese Methode führt den Konvertierungsprozess gemäß dem folgenden Verfahren durch.

  1. Generieren Sie einen Zuordnungsschlüssel aus dem Typ des Quellobjekts und dem Zieldatentyp des Arguments.
  2. Rufen Sie das TypeConverter-Objekt aus der Zuordnung des Argumentdatenkonvertierungstyps ab.
  3. Rufen Sie die Apply-Methode des Function-Objekts des TypeConverter-Objekts auf, um den Datentyp zu konvertieren.

Wenn das Quellobjekt des Arguments jedoch null ist oder in den Zieldatentyp umgewandelt werden kann, wird das Quellobjekt unverändert ohne Konvertierungsverarbeitung zurückgegeben.

In 2 wird "static TypeConverter # get" verwendet. Wenn jedoch die Kombination aus dem angegebenen Quelldatentyp und dem Zieldatentyp nicht gefunden werden kann, kann der Quelldatentyp nicht in der Schnittstelle oder Oberklasse dieses Typs gefunden werden. Ich werde es versuchen. Wenn es gefunden wird, können Sie seine Konvertierungsfunktion verwenden. Erstellen Sie daher einen Schlüssel aus dem gefundenen Datentyp und dem Zieldatentyp und registrieren Sie ihn in der Karte, damit Sie beim nächsten Konvertierungsprozess einfach nach dem TypeConverter-Objekt suchen können. Wenn kein konvertierbares TypeConverter-Objekt gefunden wird, wird eine ConvertException ausgelöst.

Speicherort des TypeConverter-Objekts

Das TypeConverter-Objekt wird in einer Variablen vom Typ Map <String, TypeConverter <?,? >> in den folgenden Klassen gespeichert.

  1. TypeConverter-Klasse
  2. Standardklasse und ihre Unterklassen (MySQL, Oracle, PostgreSQL, SQLite, SQLServer)

1 hat eine Karte von statischen Variablen und 2 hat eine Karte von Instanzvariablen. Die Standardklasse und ihre Unterklassen sind Singleton-Klassen, und es gibt nur ein Objekt pro Klasse. Daher gibt es eine Datentypkonvertierungszuordnung pro Klasse sowie 1.

Zwei werden üblicherweise bei der Konvertierung von Datentypen verwendet, und welche verwendet wird, wird durch Angabe der Database-Eigenschaft von opensleep.propeties bestimmt.

TypeConverter-Objekt, das in der Datentypkonvertierungszuordnung jeder Klasse gespeichert ist

TypeConverter-Klasse

Die Datentypkonvertierungszuordnung dieser Klasse enthält die folgenden TypeConverter-Objekte, die allgemeine Datentypkonvertierungen durchführen, die von der O / R-Zuordnung unabhängig sind.

Konvertierungsquellendatentyp Konvertierungszieldatentyp Konvertierungsinhalt
Byte Boolescher Wert 0 ➔ false
1 ➔ true
In anderen Fällen wird ConvertException ausgelöst
Short
Integer
Long
Float
Double
BigDecimal
Zeichen '0' ➔ false
'1' ➔ true
In anderen Fällen ConvertException auslösen
String "0" ➔ false
"1" ➔ true
In anderen Fällen ConvertException auslösen
Boolean Bytefalse ➔ 0
true ➔ 1
Short Auslösen der ConvertException, wenn außerhalb des Bereichs
Integer
Long
Float
Double
BigDecimal
Character
String ConvertException auslösen, wenn nicht numerisch oder außerhalb des Bereichs
Boolean Shortfalse ➔ 0
true ➔ 1
Byte
Integer Löst eine ConvertException aus, wenn sie außerhalb des Bereichs liegt
Long
Float
Double
BigDecimal
Character
String ConvertException auslösen, wenn nicht numerisch oder außerhalb des Bereichs
Boolean Integerfalse ➔ 0
true ➔ 1
Byte
Short
Long Löst eine ConvertException aus, wenn sie außerhalb des Bereichs liegt
Float
Double
BigDecimal
Character
String ConvertException auslösen, wenn nicht numerisch oder außerhalb des Bereichs
java.util.Date Löst eine ConvertException aus, wenn sie außerhalb des Bereichs liegt
Boolean Longfalse ➔ 0
true ➔ 1
Byte
Short
Integer
Float Löst eine ConvertException aus, wenn sie außerhalb des Bereichs liegt
Double
BigDecimal
Character
String ConvertException auslösen, wenn nicht numerisch oder außerhalb des Bereichs
java.util.Date Langer Wert abrufen
Boolean Floatfalse ➔ 0.0F
true ➔ 1.0F
Byte
Short
Integer
Long
Double
BigDecimal
Character
String Löst eine ConvertException für nicht numerische Werte aus
Boolean Doublefalse ➔ 0.0D
true ➔ 1.0D
Byte
Short
Integer
Long
Float
BigDecimal
Character
String Löst eine ConvertException für nicht numerische Werte aus
Boolean BigDecimalfalse ➔ BigDecimal.ZERO
true ➔ BigDecimal.ONE
Byte
Short
Integer
Long
Float
Double
Character
String Löst eine ConvertException für nicht numerische Werte aus
Boolean Characterfalse ➔ '0'
true ➔ '1'
Byte
Short
Integer Löst eine ConvertException aus, wenn sie außerhalb des Bereichs liegt
Long
Float
Double
BigDecimal
String Löst eine ConvertException aus, wenn die Stringlänge nicht 1 ist
BigDecimal String Konvertieren mit toPlainString ()
java.uitl.Date"yyyy-MM-dd"
java.sql.Date
Time "HH:mm:ss"
Timestamp "yyyy-MM-dd HH:mm:ss.SSS"
Objekt Konvertieren mit toString ()
Integer java.util.Date
Long
BigDecimal Löst eine ConvertException aus, wenn die Konvertierung in Long außerhalb des Bereichs liegt
String "yyyy-MM-dd" ➔ String
Löst eine ConvertException aus, wenn das Format falsch ist
Integer java.sql.Date
Long
BigDecimal Löst eine ConvertException aus, wenn die Konvertierung in Long außerhalb des Bereichs liegt
java.util.Date
String "yyyy-MM-dd" ➔ String
Löst eine ConvertException aus, wenn das Format falsch ist
Integer Time
Long
BigDecimal Löst eine ConvertException aus, wenn die Konvertierung in Long außerhalb des Bereichs liegt
java.util.Date
String "HH: mm: ss" ➔ String
Löst eine ConvertException aus, wenn das Format falsch ist
Long Timestamp
Integer
BigDecimal Löst eine ConvertException aus, wenn die Konvertierung in Long außerhalb des Bereichs liegt
java.util.Date
Zeichenfolge "JJJJ-MM-TT HH: MM: SS" oder
"JJJJ-MM-TT HH: MM: ss.SSS " ➔ String
Löst eine ConvertException aus, wenn das Format falsch ist
Aufzählung Byte Mit original konvertieren ()
ConvertException auslösen, wenn außerhalb des Bereichs
Short
Integer Mit original () konvertieren
Long

Standardklasse

Die Datentypkonvertierungszuordnung dieser Klasse fügt allen TypeConverter-Objekten der TypeConverter-Klasse ein TypeConverter-Objekt hinzu, das für die folgenden O / R-Zuordnungen spezifisch ist.

weniger
Konvertierungsquellendatentyp Konvertierungszieldatentyp Konvertierungsinhalt
Clob String Löst eine ConvertException aus, wenn die Länge Integer.MAX_VALUE überschreitet.
Inhalt Löst eine ConvertException aus, wenn beim Abrufen von eine SQLException ausgelöst wird
Blob byte[]
java.sql.Array boolean [] Konvertieren Sie jedes Element mit TypeConverter in den Datentyp eines Array-Elements
byte[]
short[]
int[]
long[]
float[]
double[]
BigDecimal[]
String[]
java.util.Date[]
java.sql.Date[]
Time[]
Timestamp[]
Boolean SqlStringfalse ➔ FALSE
true ➔ TRUE
Object '...'
Character
BigDecimal
String '...'
Wenn lang, ? (SQL-Parameter) >
java.util.DateDATE'yyyy-MM-dd'
java.sql.Date
Time TIME'HH:mm:ss'
Timestamp TIMESTAMP'yyyy-MM-dd HH:mm:ss.SSS'
Byte [] X '...'
Wenn lang, ? (SQL-Parameter)
boolean [] ARRAY [x, y, z, ...]
Verwandeln Sie jedes Element mit TypeConverter in einen SqlString Konvertierung
char[]
byte[][]
short[]
int[]
long[]
float[]
double[]
BigDecimal[]
String[]
java.util.Date[]
java.sql.Date[]
Time[]
Timestamp[]
Iterable (x, y, z, ...)
Konvertieren Sie jedes Element mit TypeConverter in SqlString >

MySQL-Klasse

Die Datentypkonvertierungszuordnung für diese Klasse fügt jedem TypeConverter-Objekt der Standardklasse ein MySQL-spezifisches TypeConverter-Objekt hinzu.

Konvertierungsquellendatentyp Konvertierungszieldatentyp Konvertierungsinhalt
BooleanSqlStringfalse ➔ 0
true ➔ 1
String '...'
Steuerzeichen werden in Escape-Sequenzen konvertiert.
? wenn lang > (SQL-Parameter)

Oracle-Klasse

Die Datentypkonvertierungszuordnung für diese Klasse fügt jedem TypeConverter-Objekt der Standardklasse ein Oracle Database-spezifisches TypeConverter-Objekt hinzu.

Konvertierungsquellendatentyp Konvertierungszieldatentyp Konvertierungsinhalt
BooleanSqlStringfalse ➔ 0
true ➔ 1
String '...'
Das Steuerzeichen ist'...'||CHR(n)||'...'Umstellung auf
Wenn lang? (SQL-Parameter)
Time TO_TIMESTAMP('1970-01-01 HH:mm:ss','YYYY-MM-DD HH24:MI:SS.FF3')
Byte [] ? (SQL-Parameter)
oracle.sql.TIMESTAMP java.util.Date Wenn beim Abrufen des Werts eine SQLException ausgelöst wird ConvertException auslösen
java.sql.Date
java.sql.Time
java.sql.Timestamp

PostgreSQL-Klasse

Die Datentypkonvertierungszuordnung dieser Klasse fügt allen TypeConverter-Objekten der Standardklasse ein PostgreSQL-spezifisches TypeConverter-Objekt hinzu.

Konvertierungsquellendatentyp Konvertierungszieldatentyp Konvertierungsinhalt
String SqlString '...'
Steuerzeichen, die in Escape-Sequenzen konvertiert wurden
Wenn es lang ist, ? (SQL-Parameter)
Byte [] E '\\ x ...'
Wenn lang, ? ( SQL-Parameter)

SQLite-Klasse

Die Datentypkonvertierungszuordnung für diese Klasse fügt jedem TypeConverter-Objekt der Standardklasse ein SQLite-spezifisches TypeConverter-Objekt hinzu.

Konvertierungsquellendatentyp Konvertierungszieldatentyp Konvertierungsinhalt
Boolean SqlStringfalse ➔ 0
true ➔ 1
java.util.Date'yyyy-MM-dd'
java.sql.Date
Time 'HH:mm:ss'
Timestamp 'yyyy-MM-dd HH:mm:ss.SSS'
Byte [] ? (SQL-Parameter)

SQLServer-Klasse

Die Datentypkonvertierungszuordnung für diese Klasse fügt jedem TypeConverter-Objekt der Standardklasse ein Microsoft SQL Server-spezifisches TypeConverter-Objekt hinzu.

Konvertierungsquellendatentyp Konvertierungszieldatentyp Konvertierungsinhalt
Boolean SqlStringfalse ➔ 0
true ➔ 1
java.sql.DateCAST('yyyy:MM:dd' AS DATE)
Time CAST('HH:mm:ss' AS DATE)
Timestamp CAST('yyyy-MM-dd HH:mm:ss.SSS' AS DATETIME2)
String '...'
Das Steuerzeichen ist '...' + CHAR (n) + '... In '
konvertieren? (SQL-Parameter) , wenn lang
Byte [] ? (SQL-Parameter)

Recommended Posts

Flexibler Datentypkonvertierungsmechanismus der O / R-Zuordnungsbibliothek Lightsleep für Java 8
Schrittweises Verständnis der O / R-Zuordnung
Einführung in Lightsleep, eine O / R-Zuordnungsbibliothek, die nur mit Java Runtime- und JDBC-Treibern funktioniert
Konvertierung des Java-Datumsdatentyps (Datum, Kalender, Zeichenfolge)
[Grundkenntnisse in Java] Informationen zur Typkonvertierung
[Java] Berechnungsmechanismus, Operatoren und Typkonvertierung
Java-Typkonvertierung
Überprüfung und Implementierung der CSV-Bibliothek zum Laden großer Datenmengen in MySQL (Java)
JAVA-Objektzuordnungsbibliothek
[Java] Datentyp ①-Basistyp
[Java] Konvertierung des Datumstyps