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 funktioniertLightsleep 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.
Es wird hauptsächlich an den folgenden zwei Stellen verwendet.
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'
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.
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:
TypeConverter(Class<ST> sourceType, Class<DT> destinType, Function<ST, DT> function)
<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.
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.
Das TypeConverter-Objekt wird in einer Variablen vom Typ Map <String, TypeConverter <?,? >>
in den folgenden Klassen gespeichert.
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.
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 th> | Konvertierungszieldatentyp th> | Konvertierungsinhalt th> tr> | |||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Byte td> | Boolescher Wert td> | 0 ➔ false 1 ➔ true In anderen Fällen wird ConvertException ausgelöst td> tr> | |||||||||||||||||||||||||||||||||||||||
Short | |||||||||||||||||||||||||||||||||||||||||
Integer | |||||||||||||||||||||||||||||||||||||||||
Long | |||||||||||||||||||||||||||||||||||||||||
Float | |||||||||||||||||||||||||||||||||||||||||
Double | |||||||||||||||||||||||||||||||||||||||||
BigDecimal | |||||||||||||||||||||||||||||||||||||||||
Zeichen td> | '0' ➔ false '1' ➔ true In anderen Fällen td> tr> ConvertException auslösen | ||||||||||||||||||||||||||||||||||||||||
String td> | "0" ➔ false "1" ➔ true In anderen Fällen td> tr> ConvertException auslösen | ||||||||||||||||||||||||||||||||||||||||
Boolean | Byte | false ➔ 0 true ➔ 1 | |||||||||||||||||||||||||||||||||||||||
Short td> | Auslösen der ConvertException, wenn außerhalb des Bereichs td> tr> | ||||||||||||||||||||||||||||||||||||||||
Integer | |||||||||||||||||||||||||||||||||||||||||
Long | |||||||||||||||||||||||||||||||||||||||||
Float | |||||||||||||||||||||||||||||||||||||||||
Double | |||||||||||||||||||||||||||||||||||||||||
BigDecimal | |||||||||||||||||||||||||||||||||||||||||
Character | |||||||||||||||||||||||||||||||||||||||||
String td> | ConvertException auslösen, wenn nicht numerisch oder außerhalb des Bereichs td> tr> | ||||||||||||||||||||||||||||||||||||||||
Boolean | Short | false ➔ 0 true ➔ 1 | |||||||||||||||||||||||||||||||||||||||
Byte | |||||||||||||||||||||||||||||||||||||||||
Integer td> | Löst eine ConvertException aus, wenn sie außerhalb des Bereichs td> tr> liegt | ||||||||||||||||||||||||||||||||||||||||
Long | |||||||||||||||||||||||||||||||||||||||||
Float | |||||||||||||||||||||||||||||||||||||||||
Double | |||||||||||||||||||||||||||||||||||||||||
BigDecimal | |||||||||||||||||||||||||||||||||||||||||
Character | |||||||||||||||||||||||||||||||||||||||||
String td> | ConvertException auslösen, wenn nicht numerisch oder außerhalb des Bereichs td> tr> | ||||||||||||||||||||||||||||||||||||||||
Boolean | Integer | false ➔ 0 true ➔ 1 | |||||||||||||||||||||||||||||||||||||||
Byte | |||||||||||||||||||||||||||||||||||||||||
Short | |||||||||||||||||||||||||||||||||||||||||
Long td> | Löst eine ConvertException aus, wenn sie außerhalb des Bereichs td> tr> liegt | ||||||||||||||||||||||||||||||||||||||||
Float | |||||||||||||||||||||||||||||||||||||||||
Double | |||||||||||||||||||||||||||||||||||||||||
BigDecimal | |||||||||||||||||||||||||||||||||||||||||
Character | |||||||||||||||||||||||||||||||||||||||||
String td> | ConvertException auslösen, wenn nicht numerisch oder außerhalb des Bereichs td> tr> | ||||||||||||||||||||||||||||||||||||||||
java.util.Date td> | Löst eine ConvertException aus, wenn sie außerhalb des Bereichs td> tr> liegt | ||||||||||||||||||||||||||||||||||||||||
Boolean | Long | false ➔ 0 true ➔ 1 | |||||||||||||||||||||||||||||||||||||||
Byte | |||||||||||||||||||||||||||||||||||||||||
Short | |||||||||||||||||||||||||||||||||||||||||
Integer | |||||||||||||||||||||||||||||||||||||||||
Float td> | Löst eine ConvertException aus, wenn sie außerhalb des Bereichs td> tr> liegt | ||||||||||||||||||||||||||||||||||||||||
Double | |||||||||||||||||||||||||||||||||||||||||
BigDecimal | |||||||||||||||||||||||||||||||||||||||||
Character | |||||||||||||||||||||||||||||||||||||||||
String td> | ConvertException auslösen, wenn nicht numerisch oder außerhalb des Bereichs td> tr> | ||||||||||||||||||||||||||||||||||||||||
java.util.Date td> | Langer Wert abrufen td> tr> | ||||||||||||||||||||||||||||||||||||||||
Boolean | Float | false ➔ 0.0F true ➔ 1.0F | |||||||||||||||||||||||||||||||||||||||
Byte | |||||||||||||||||||||||||||||||||||||||||
Short | |||||||||||||||||||||||||||||||||||||||||
Integer | |||||||||||||||||||||||||||||||||||||||||
Long | |||||||||||||||||||||||||||||||||||||||||
Double | |||||||||||||||||||||||||||||||||||||||||
BigDecimal | |||||||||||||||||||||||||||||||||||||||||
Character | |||||||||||||||||||||||||||||||||||||||||
String td> | Löst eine ConvertException für nicht numerische Werte aus td> tr> | ||||||||||||||||||||||||||||||||||||||||
Boolean | Double | false ➔ 0.0D true ➔ 1.0D | |||||||||||||||||||||||||||||||||||||||
Byte | |||||||||||||||||||||||||||||||||||||||||
Short | |||||||||||||||||||||||||||||||||||||||||
Integer | |||||||||||||||||||||||||||||||||||||||||
Long | |||||||||||||||||||||||||||||||||||||||||
Float | |||||||||||||||||||||||||||||||||||||||||
BigDecimal | |||||||||||||||||||||||||||||||||||||||||
Character | |||||||||||||||||||||||||||||||||||||||||
String td> | Löst eine ConvertException für nicht numerische Werte aus td> tr> | ||||||||||||||||||||||||||||||||||||||||
Boolean | BigDecimal | false ➔ BigDecimal.ZERO true ➔ BigDecimal.ONE | |||||||||||||||||||||||||||||||||||||||
Byte | |||||||||||||||||||||||||||||||||||||||||
Short | |||||||||||||||||||||||||||||||||||||||||
Integer | |||||||||||||||||||||||||||||||||||||||||
Long | |||||||||||||||||||||||||||||||||||||||||
Float | |||||||||||||||||||||||||||||||||||||||||
Double | |||||||||||||||||||||||||||||||||||||||||
Character | |||||||||||||||||||||||||||||||||||||||||
String td> | Löst eine ConvertException für nicht numerische Werte aus td> tr> | ||||||||||||||||||||||||||||||||||||||||
Boolean | Character | false ➔ '0' true ➔ '1' | |||||||||||||||||||||||||||||||||||||||
Byte | |||||||||||||||||||||||||||||||||||||||||
Short | |||||||||||||||||||||||||||||||||||||||||
Integer td> | Löst eine ConvertException aus, wenn sie außerhalb des Bereichs td> tr> liegt | ||||||||||||||||||||||||||||||||||||||||
Long | |||||||||||||||||||||||||||||||||||||||||
Float | |||||||||||||||||||||||||||||||||||||||||
Double | |||||||||||||||||||||||||||||||||||||||||
BigDecimal | |||||||||||||||||||||||||||||||||||||||||
String td> | Löst eine ConvertException aus, wenn die Stringlänge nicht 1 td> tr> ist | ||||||||||||||||||||||||||||||||||||||||
BigDecimal td> | String td> | Konvertieren mit toPlainString () td> tr> | |||||||||||||||||||||||||||||||||||||||
java.uitl.Date | "yyyy-MM-dd" | ||||||||||||||||||||||||||||||||||||||||
java.sql.Date | |||||||||||||||||||||||||||||||||||||||||
Time | "HH:mm:ss" | ||||||||||||||||||||||||||||||||||||||||
Timestamp | "yyyy-MM-dd HH:mm:ss.SSS" | ||||||||||||||||||||||||||||||||||||||||
Objekt td> | Konvertieren mit toString () td> tr> | ||||||||||||||||||||||||||||||||||||||||
Integer | java.util.Date | ||||||||||||||||||||||||||||||||||||||||
Long | |||||||||||||||||||||||||||||||||||||||||
BigDecimal td> | Löst eine ConvertException aus, wenn die Konvertierung in Long außerhalb des Bereichs td> tr> liegt | ||||||||||||||||||||||||||||||||||||||||
String td> | "yyyy-MM-dd" code> ➔ String |
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.
Konvertierungsquellendatentyp th> | Konvertierungszieldatentyp th> | Konvertierungsinhalt th> tr> | |||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Clob td> | String td> | Löst eine ConvertException aus, wenn die Länge Integer.MAX_VALUE code> überschreitet. |
Die Datentypkonvertierungszuordnung für diese Klasse fügt jedem TypeConverter-Objekt der Standardklasse ein MySQL-spezifisches TypeConverter-Objekt hinzu.
Konvertierungsquellendatentyp th> | Konvertierungszieldatentyp th> | Konvertierungsinhalt th> tr> |
---|---|---|
Boolean | SqlString | false ➔ 0 true ➔ 1 |
String td> | '...' code> |
Die Datentypkonvertierungszuordnung für diese Klasse fügt jedem TypeConverter-Objekt der Standardklasse ein Oracle Database-spezifisches TypeConverter-Objekt hinzu.
Konvertierungsquellendatentyp th> | Konvertierungszieldatentyp th> | Konvertierungsinhalt th> tr> | |||||
---|---|---|---|---|---|---|---|
Boolean | SqlString | false ➔ 0 true ➔ 1 | |||||
String | '...' Das Steuerzeichen ist '...'||CHR(n)||'...' Umstellung aufWenn lang ? (SQL-Parameter) | ||||||
Time | TO_TIMESTAMP('1970-01-01 HH:mm:ss','YYYY-MM-DD HH24:MI:SS.FF3') | ||||||
Byte [] td> | ? Code> (SQL-Parameter) i> td> tr>
|
Die Datentypkonvertierungszuordnung dieser Klasse fügt allen TypeConverter-Objekten der Standardklasse ein PostgreSQL-spezifisches TypeConverter-Objekt hinzu.
Konvertierungsquellendatentyp th> | Konvertierungszieldatentyp th> | Konvertierungsinhalt th> tr> | ||
---|---|---|---|---|
String td> | SqlString td> | '...' code> |
Die Datentypkonvertierungszuordnung für diese Klasse fügt jedem TypeConverter-Objekt der Standardklasse ein SQLite-spezifisches TypeConverter-Objekt hinzu.
Konvertierungsquellendatentyp th> | Konvertierungszieldatentyp th> | Konvertierungsinhalt th> tr> |
---|---|---|
Boolean | SqlString | false ➔ 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 [] td> | ? Code> (SQL-Parameter) i> td> tr>
|
Die Datentypkonvertierungszuordnung für diese Klasse fügt jedem TypeConverter-Objekt der Standardklasse ein Microsoft SQL Server-spezifisches TypeConverter-Objekt hinzu.
Konvertierungsquellendatentyp th> | Konvertierungszieldatentyp th> | Konvertierungsinhalt th> tr> | |
---|---|---|---|
Boolean | SqlString | false ➔ 0 true ➔ 1 | |
java.sql.Date | CAST('yyyy:MM:dd' AS DATE) | ||
Time | CAST('HH:mm:ss' AS DATE) | ||
Timestamp | CAST('yyyy-MM-dd HH:mm:ss.SSS' AS DATETIME2) | ||
String td> | '...' code> |
Recommended Posts