Mécanisme de conversion de type de données flexible de la bibliothèque de mappage O / R Lightsleep pour Java 8

En ce qui concerne Lightsleep, j'ai publié un article d'introduction sur Qiita, veuillez donc voir ci-dessous.

Présentation de Lightsleep, une bibliothèque de mappage O / R qui fonctionne uniquement avec les pilotes Java Runtime et JDBC

Lightsleep dispose d'un mécanisme de conversion flexible du type de données, qui est utilisé en interne. Il n'est pas essentiel de connaître les détails de l'utilisation de Lightsleep, mais il est utile de savoir quel type de conversion sera effectué.

Où utiliser la conversion de type de données

Il est principalement utilisé dans les deux endroits suivants.

  1. Où convertir les valeurs de propriété des objets entité en chaînes littérales pour générer du SQL Par exemple

    • "Yukari's apples"'Yukari''s apples'
    • 2017/2/12 (java.sql.Date) ➔ DATE'2017-02-17'
  2. Où définir la valeur obtenue à partir de DB dans l'objet entité Par exemple --BigDecimal ➔ Integer (le type de colonne est NUMBER (9) / Oracle) --Long ➔ java.sql.Date (le type de colonne est BIGINT)

Le 2 ci-dessus est le but initial de la conversion de type de données, de sorte qu'il puisse être stocké même si la valeur à stocker et le type de la variable pour le stocker sont différents.

1 utilise ce mécanisme pour générer des chaînes littérales SQL. Étant donné que le contenu de la conversion est différent d'une chaîne de caractères normale, le type de données de destination de la conversion est la classe SqlString. En ayant une mappe de conversion de type de données pour chaque gestionnaire de base de données, il est possible de générer du SQL spécifique au SGBD.

Classe qui effectue la conversion du type de données

org.lightsleep.helper.TypeConverter est une classe qui effectue une conversion de type de données. Lorsque vous utilisez Lightsleep, je ne pense pas qu'il soit courant d'utiliser directement cette classe, mais je vais l'expliquer brièvement.

Cette classe a deux constructeurs:

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

Les arguments du constructeur 1 sont le type de données source (sourceType), le type de données de destination (destinType) et l'objet fonction (fonction) pour effectuer la conversion. La fonction est décrite par une expression lambda.

java:Long->java.sql.Date


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

Les arguments du constructeur 2 sont deux autres objets TypeConverter.

java:java.util.Date->Integer


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

La méthode static TypeConverter.get dans l'exemple ci-dessus est une méthode pour obtenir l'objet TypeConverter enregistré dans la carte. L'objet Function de cet objet TypeConverter sera typeConverter1.function.andThen (typeConverter2.function) `(fonction composite).

Étant donné que l'objet TypeConverter a une clé générée à partir du type de données source de conversion et du type de données de destination de conversion, utilisez la méthode static TypeConverter # put au lieu de Map # put lors de l'enregistrement de la carte.

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)
    )
);

Le processus de conversion du type de données est effectué par la méthode static TypeConverter # convert. Cette méthode exécute le processus de conversion selon la procédure suivante.

  1. Générez une clé de mappage à partir du type de l'objet source et du type de données de destination de l'argument.
  2. Obtenez l'objet TypeConverter à partir de la mappe de type de conversion de données d'argument.
  3. Appelez la méthode apply de l'objet Function de l'objet TypeConverter pour convertir le type de données.

Toutefois, si l'objet source de l'argument est nul ou peut être converti en type de données de destination, l'objet source est renvoyé tel quel sans traitement de conversion.

Dans 2, static TypeConverter # get est utilisé, mais si le type de données source spécifié et la combinaison de type de données de destination ne peuvent pas être trouvés, le type de données source est introuvable dans l'interface ou la superclasse de ce type. Je vais essayer. S'il est trouvé, vous pouvez utiliser sa fonction de conversion, créez donc une clé à partir du type de données trouvé et du type de données de destination et enregistrez-la dans la carte afin de pouvoir simplement rechercher l'objet TypeConverter lors du processus de conversion suivant. Si aucun objet TypeConverter convertible n'est finalement trouvé, une exception ConvertException est levée.

Emplacement de stockage de l'objet TypeConverter

L'objet TypeConverter est stocké dans une variable de type Map <String, TypeConverter <?,? >> Dans les classes suivantes.

  1. Classe TypeConverter
  2. Classe standard et ses sous-classes (MySQL, Oracle, PostgreSQL, SQLite, SQLServer)

1 a une carte de variables statiques et 2 une carte de variables d'instance. La classe Standard et ses sous-classes sont des classes singleton et il n'y a qu'un seul objet par classe, il y a donc une mappe de conversion de type de données par classe ainsi que 1.

Deux sont couramment utilisés dans le processus de conversion de type de données, et celui d'entre eux est déterminé en spécifiant la propriété Database de lightsleep.propeties.

Objet TypeConverter stocké dans la carte de conversion de type de données de chaque classe

Type Classe de convertisseur

La mappe de conversion de type de données de cette classe contient les objets TypeConverter suivants qui effectuent des conversions de type de données courantes indépendantes du mappage O / R.

Type de données source de conversion Type de données de destination de conversion Contenu de la conversion
Byte Boolean 0 ➔ false
1 ➔ true
Dans les autres cas, lancez ConvertException
Short
Integer
Long
Float
Double
BigDecimal
Caractère '0' ➔ faux
'1' ➔ vrai
Lancer une exception ConvertException dans les autres cas
Chaîne "0" ➔ false
"1" ➔ true
Lancer une exception ConvertException dans les autres cas
Boolean Bytefalse ➔ 0
true ➔ 1
Court Lancer une exception ConvertException si hors de portée
Integer
Long
Float
Double
BigDecimal
Character
Chaîne Lance une exception ConvertException si non numérique ou hors plage
Boolean Shortfalse ➔ 0
true ➔ 1
Byte
Entier Lance une exception ConvertException si hors de portée
Long
Float
Double
BigDecimal
Character
Chaîne Lance une exception ConvertException si non numérique ou hors plage
Boolean Integerfalse ➔ 0
true ➔ 1
Byte
Short
Long Lancer une exception ConvertException si hors de portée
Float
Double
BigDecimal
Character
Chaîne Lance une exception ConvertException si non numérique ou hors plage
java.util.Date Lance une exception ConvertException si hors de portée
Boolean Longfalse ➔ 0
true ➔ 1
Byte
Short
Integer
Float Lancer une exception ConvertException si hors de portée
Double
BigDecimal
Character
Chaîne Lance une exception ConvertException si non numérique ou hors plage
java.util.Date Obtenir une valeur longue
Boolean Floatfalse ➔ 0.0F
true ➔ 1.0F
Byte
Short
Integer
Long
Double
BigDecimal
Character
Chaîne Lance une exception ConvertException pour les valeurs non numériques
Boolean Doublefalse ➔ 0.0D
true ➔ 1.0D
Byte
Short
Integer
Long
Float
BigDecimal
Character
Chaîne Lance une exception ConvertException pour les valeurs non numériques
Boolean BigDecimalfalse ➔ BigDecimal.ZERO
true ➔ BigDecimal.ONE
Byte
Short
Integer
Long
Float
Double
Character
Chaîne Lance une exception ConvertException pour les valeurs non numériques
Boolean Characterfalse ➔ '0'
true ➔ '1'
Byte
Short
Entier Lance une exception ConvertException si hors de portée
Long
Float
Double
BigDecimal
String Lance une exception ConvertException si la longueur de la chaîne est différente de 1
BigDecimal String Convertir avec toPlainString ()
java.uitl.Date"yyyy-MM-dd"
java.sql.Date
Time "HH:mm:ss"
Timestamp "yyyy-MM-dd HH:mm:ss.SSS"
Objet Convertir avec toString ()
Integer java.util.Date
Long
BigDecimal Lance une exception ConvertException si la conversion en Long est hors de portée
Chaîne "aaaa-MM-jj" ➔ Chaîne
Lance une exception ConvertException si le format est incorrect
Integer java.sql.Date
Long
BigDecimal Lance une exception ConvertException si la conversion en Long est hors de portée
java.util.Date
Chaîne "aaaa-MM-jj" ➔ Chaîne
Lance une exception ConvertException si le format est incorrect
Integer Time
Long
BigDecimal Lance une exception ConvertException si la conversion en Long est hors de portée
java.util.Date
Chaîne "HH: mm: ss" ➔ Chaîne
Lance une exception ConvertException si le format est incorrect
Long Timestamp
Integer
BigDecimal Lance une exception ConvertException si la conversion en Long est hors de portée
java.util.Date
Chaîne "aaaa-MM-jj HH: mm: ss" ou
"aaaa-MM-jj HH: mm: ss.SSS " ➔ Chaîne
Lance une exception ConvertException si le format est incorrect
Enum Byte Convertir avec original ()
Lance une exception ConvertException si hors de portée
Short
Entier Convertir avec original ()
Long

Classe standard

La mappe de conversion de type de données de cette classe ajoute un objet TypeConverter spécifique aux mappages O / R suivants à tous les objets TypeConverter de la classe TypeConverter.

Type de données source de conversion Type de données de destination de conversion Contenu de la conversion
Clob Chaîne Lance une exception ConvertException si la longueur dépasse Integer.MAX_VALUE
Table des matières Lance ConvertException si SQLException est levée lors de la récupération de
Blob byte[]
java.sql.Array boolean [] Convertit chaque élément en type de données d'un élément de tableau avec TypeConverter
byte[]
short[]
int[]
long[]
float[]
double[]
BigDecimal[]
String[]
java.util.Date[]
java.sql.Date[]
Time[]
Timestamp[]
Boolean SqlStringfalse ➔ FALSE
true ➔ TRUE
Object '...'
Character
BigDecimal
Chaîne '...'
Si long, ? (paramètre SQL) >
java.util.DateDATE'yyyy-MM-dd'
java.sql.Date
Time TIME'HH:mm:ss'
Timestamp TIMESTAMP'yyyy-MM-dd HH:mm:ss.SSS'
Enum '...' (converti avec toString ())
octet [] X '...'
Si long, ? (paramètre SQL)
boolean [] ARRAY [x, y, z, ...]
Transformez chaque élément en une SqlString avec TypeConverter Conversion
char[]
byte[][]
short[]
int[]
long[]
float[]
double[]
BigDecimal[]
String[]
java.util.Date[]
java.sql.Date[]
Time[]
Timestamp[]
Iterable (x, y, z, ...)
Convertissez chaque élément en SqlString avec TypeConverter >

Classe MySQL

La mappe de conversion de type de données pour cette classe ajoute un objet TypeConverter spécifique à MySQL à chaque objet TypeConverter de la classe Standard.

Type de données source de conversion Type de données de destination de conversion Contenu de la conversion
BooleanSqlStringfalse ➔ 0
true ➔ 1
String '...'
Les caractères de contrôle sont convertis en séquences d'échappement
? si long > (paramètres SQL)

Classe Oracle

La mappe de conversion de type de données pour cette classe ajoute un objet TypeConverter spécifique à Oracle Database à chaque objet TypeConverter de la classe Standard.

Type de données source de conversion Type de données de destination de conversion Contenu de la conversion
BooleanSqlStringfalse ➔ 0
true ➔ 1
String '...'
Le caractère de contrôle est'...'||CHR(n)||'...'Conversion en
Si long? (Paramètres SQL)
Time TO_TIMESTAMP('1970-01-01 HH:mm:ss','YYYY-MM-DD HH24:MI:SS.FF3')
octet [] ? (paramètre SQL)
oracle.sql.TIMESTAMP java.util.Date Lorsque SQLException est levée lors de l'obtention de la valeur Lancer une exception ConvertException
java.sql.Date
java.sql.Time
java.sql.Timestamp

Classe PostgreSQL

La mappe de conversion de type de données de cette classe ajoute un objet TypeConverter spécifique à PostgreSQL à tous les objets TypeConverter de la classe Standard.

Type de données source de conversion Type de données de destination de conversion Contenu de la conversion
String SqlString '...'
Caractères de contrôle convertis en séquences d'échappement
S'il est long, ? (paramètre SQL)
octet [] E '\\ x ...'
Si long, ? ( Paramètres SQL)

Classe SQLite

La mappe de conversion de type de données pour cette classe ajoute un objet TypeConverter spécifique à SQLite à chaque objet TypeConverter de la classe Standard.

Type de données source de conversion Type de données de destination de conversion Contenu de la conversion
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'
octet [] ? (paramètre SQL)

Classe SQLServer

La mappe de conversion de type de données pour cette classe ajoute un objet TypeConverter spécifique à Microsoft SQL Server à chaque objet TypeConverter de la classe Standard.

Type de données source de conversion Type de données de destination de conversion Contenu de la conversion
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 '...'
Le caractère de contrôle est '...' + CHAR (n) + '... Convertir en '
? (paramètre SQL) si long
octet [] ? (paramètre SQL)

Recommended Posts

Mécanisme de conversion de type de données flexible de la bibliothèque de mappage O / R Lightsleep pour Java 8
Compréhension étape par étape de la cartographie O / R
Présentation de Lightsleep, une bibliothèque de mappage O / R qui fonctionne uniquement avec les pilotes Java Runtime et JDBC
Conversion de type de données de date Java (date, calendrier, chaîne)
[Connaissance de base de Java] À propos de la conversion de type
[Java] Mécanisme de calcul, opérateurs et conversion de type
Conversion de type Java
Examen et mise en œuvre de la bibliothèque CSV pour le chargement de grandes quantités de données dans MySQL (Java)
Bibliothèque de mappage d'objets JAVA
[Java] Type de données ①-Type de base
[Java] Conversion de type de date