--Afficher un exemple de code dans Oracle Database 12c qui définit les colonnes des principaux types de données SQL dans une table et récupère les valeurs de colonne d'un programme Java. --Cet environnement de vérification des opérations: Oracle Database 12c Release 2 (12.2.0.1.0) Enterprise Edition (sur Docker) + pilote Oracle JDBC Thin (ojdbc8.jar) 19.7.0.0 + Java 14 (AdoptOpenJDK 14.0.2) + Gradle 6.6 + macOS Catalina
├── build.gradle
└── src
└── main
└── java
└── JdbcSample.java
build.gradle
plugins {
id 'application'
id 'java'
}
sourceCompatibility = JavaVersion.VERSION_14
repositories {
mavenCentral()
}
dependencies {
//Spécifiez runtimeOnly si vous souhaitez simplement utiliser le pilote Oracle JDBC lors de l'exécution
//runtimeOnly 'com.oracle.database.jdbc:ojdbc8:19.7.0.0'
//Cette fois oracle.jdbc.Spécifiez l'implémentation pour utiliser OracleTypes
implementation 'com.oracle.database.jdbc:ojdbc8:19.7.0.0'
}
tasks.withType(JavaCompile) {
//Utiliser la fonction de prévisualisation de Java 14
options.compilerArgs += ['--enable-preview']
}
application {
//Utiliser la fonction de prévisualisation de Java 14
applicationDefaultJvmArgs = ['--enable-preview']
mainClassName = 'JdbcSample'
}
JdbcSample.java
import oracle.jdbc.OracleTypes; //Non requis si vous l'utilisez normalement(Cette fois, utilisé pour obtenir des informations sur le type JDBC étendu Oracle)
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.sql.Types;
import java.util.Arrays;
class JdbcSample {
public static void main(String[] args) throws Exception {
//Connectez-vous à MySQL
String url = "jdbc:oracle:thin:@//localhost:1521/testdb";
String user = "javarista";
String password = "cafebabe";
Connection con = DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
//Créer une table
//Définir des colonnes avec différents types de données SQL
// (Utilisez la fonction de bloc de texte qui peut être écrite comme un document d'entendre qui peut être utilisée avec la fonction d'aperçu Java 14)
stmt.execute("""
create table test (
--Type de chaîne
my_char CHAR(8 CHAR), --Chaîne de caractères de longueur fixe(Fondamentalement, longueur maximale de 2000 octets)
my_varchar2 VARCHAR2(512 CHAR), --Chaîne de caractères de longueur variable(Fondamentalement, longueur maximale de 4000 octets)
my_clob CLOB, -- Character Large Object
--Type binaire
my_raw RAW(256), --Binaire de longueur variable(Fondamentalement, longueur maximale de 2000 octets)
my_blob BLOB, -- Binary Large Object
--Type booléen
my_number_1 NUMBER(1), --0 est interprété comme faux, toutes les autres valeurs sont interprétées comme vrai
--Type entier
my_number_38 NUMBER(38), --Jusqu'à 38 chiffres
my_smallint SMALLINT, --Type de données ANSI converti en type de données Oracle
my_integer INTEGER, --Type de données ANSI converti en type de données Oracle
--Type à virgule flottante
my_binary_float BINARY_FLOAT, --Nombre à virgule flottante simple précision 4 octets
my_binary_double BINARY_DOUBLE, --Nombre à virgule flottante double précision 8 octets
my_float FLOAT, --Type de données Oracle FLOAT(126)Type de données ANSI converti en
my_double_precision DOUBLE PRECISION, --Type de données Oracle FLOAT(126)Type de données ANSI converti en
my_real REAL, --Type de données Oracle FLOAT(63)Type de données ANSI converti en
--Type de point fixe
my_fixed_point_number NUMBER(7, 4), --Nombre décimal fixe
my_numeric NUMERIC(7, 4), --Type de données ANSI converti en type de données Oracle
my_decimal DECIMAL(7, 4), --Type de données ANSI converti en type de données Oracle
--Type d'heure
my_date DATE, --Date+Heures, minutes et secondes
my_timestamp TIMESTAMP(9), --Date+Heures, minutes et secondes+Nano secondes
my_timestamp_with_time_zone TIMESTAMP(9) WITH TIME ZONE --Date+Heures, minutes et secondes+Nano secondes+Fuseau horaire
)""");
//Ajouter un enregistrement
// (Utilisez la fonction de bloc de texte qui peut être écrite comme un document d'entendre qui peut être utilisée avec la fonction d'aperçu Java 14)
stmt.execute("""
insert into test values (
--Type de chaîne
'Hello', -- CHAR
'Hello', -- VARCHAR2
'Hello', -- CLOB
--Type binaire
HEXTORAW('CAFEBABE'), -- RAW
HEXTORAW('CAFEBABE'), -- BLOB,
--Type booléen
1, --0 est interprété comme faux, toutes les autres valeurs sont interprétées comme vrai
--Type entier
12345678901234567890123456789012345678, -- NUMBER(38)
32767, -- SMALLINT
2147483647, -- INTEGER
--Type à virgule flottante
123.0001, -- BINARY_FLOAT
123.0001, -- BINARY_DOUBLE
123.0001, -- FLOAT
123.0001, -- DOUBLE PRECISION
123.0001, -- REAL
--Type de point fixe
123.0001, -- NUMBER(7, 4)
123.0001, -- NUMERIC(7, 4)
123.0001, -- DECIMAL(7, 4)
--Type d'heure
TO_DATE('2001-02-03 04:05:06', 'YYYY-MM-DD HH24:MI:SS'), -- DATE
TO_TIMESTAMP('2001-02-03 04:05:06.999999999', 'YYYY-MM-DD HH24:MI:SS.FF9'), -- TIMESTAMP(9)
TO_TIMESTAMP_TZ('2001-02-03 04:05:06.999999999 +00:00', 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM') -- TIMESTAMP(9) WITH TIME ZONE
)""");
//Obtenez un enregistrement
ResultSet rs = stmt.executeQuery("select * from test");
while (rs.next()) {
//Obtenir le type d'un objet Java pour le type JDBC ou SQL d'une colonne
System.out.println("Nom de colonne-Type JDBC-Type SQL spécifique à la base de données-Type d'objet Java");
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.println(
rsmd.getColumnName(i) + " - " +
getJdbcTypeName(rsmd.getColumnType(i)) + " - " +
rsmd.getColumnTypeName(i) + " - " +
rsmd.getColumnClassName(i));
}
System.out.println();
//Obtenir les valeurs de colonne
System.out.println("Nom de colonne-Valeur de la colonne");
//Type de chaîne
System.out.println("my_char=" + rs.getString("my_char"));
System.out.println("my_varchar2=" + rs.getString("my_varchar2"));
System.out.println("my_clob=" + rs.getClob("my_clob"));
//Type binaire
System.out.println("my_raw=" + Arrays.toString(rs.getBytes("my_raw")));
System.out.println("my_blob=" + rs.getBlob("my_blob"));
//Type booléen
System.out.println("my_number_1=" + rs.getBoolean("my_number_1"));
//Type entier
System.out.println("my_number_38=" + rs.getBigDecimal("my_number_38"));
System.out.println("my_smallint=" + rs.getInt("my_smallint"));
System.out.println("my_integer=" + rs.getInt("my_integer"));
//Type à virgule flottante
System.out.println("my_binary_float=" + rs.getFloat("my_binary_float"));
System.out.println("my_binary_double=" + rs.getDouble("my_binary_double"));
System.out.println("my_float=" + rs.getDouble("my_float"));
System.out.println("my_double_precision=" + rs.getDouble("my_double_precision"));
System.out.println("my_real=" + rs.getDouble("my_real"));
//Type de point fixe
System.out.println("my_fixed_point_number=" + rs.getBigDecimal("my_fixed_point_number"));
System.out.println("my_numeric=" + rs.getBigDecimal("my_numeric"));
System.out.println("my_decimal=" + rs.getBigDecimal("my_decimal"));
//Type d'heure
System.out.println("my_date=" + rs.getTimestamp("my_date"));
System.out.println("my_timestamp=" + rs.getTimestamp("my_timestamp").toInstant());
System.out.println("my_timestamp_with_time_zone=" + rs.getTimestamp("my_timestamp_with_time_zone").toInstant());
}
stmt.close();
con.close();
}
//Obtenez le nom du type JDBC
private static String getJdbcTypeName(int type) throws IllegalAccessException {
//Recherche par type JDBC standard Java
Field[] fs = Types.class.getDeclaredFields();
for (Field f : fs) {
if (type == f.getInt(null)) {
return f.getName();
}
}
//Recherche par type JDBC d'extension Oracle
fs = OracleTypes.class.getDeclaredFields();
for (Field f : fs) {
if (type == f.getInt(null)) {
return "OracleTypes." + f.getName();
}
}
//Puisqu'il n'y avait aucun type JDBC correspondant, la valeur du type est convertie en chaîne et renvoyée.
return "" + type;
}
}
Exécutez avec la tâche d'exécution de Gradle.
$ gradle run
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :compileJava
Mise en garde:/Users/foo/bar/src/main/java/JdbcSample.java utilise la fonctionnalité de langue de prévisualisation.
Mise en garde:Le détail est,-Xlint:Veuillez recompiler avec l'option d'aperçu.
> Task :run
Nom de colonne-Type JDBC-Type SQL spécifique à la base de données-Type d'objet Java
MY_CHAR - CHAR - CHAR - java.lang.String
MY_VARCHAR2 - VARCHAR - VARCHAR2 - java.lang.String
MY_CLOB - CLOB - CLOB - oracle.jdbc.OracleClob
MY_RAW - VARBINARY - RAW - [B
MY_BLOB - BLOB - BLOB - oracle.jdbc.OracleBlob
MY_NUMBER_1 - NUMERIC - NUMBER - java.math.BigDecimal
MY_NUMBER_38 - NUMERIC - NUMBER - java.math.BigDecimal
MY_SMALLINT - NUMERIC - NUMBER - java.math.BigDecimal
MY_INTEGER - NUMERIC - NUMBER - java.math.BigDecimal
MY_BINARY_FLOAT - OracleTypes.BINARY_FLOAT - BINARY_FLOAT - java.lang.Float
MY_BINARY_DOUBLE - OracleTypes.BINARY_DOUBLE - BINARY_DOUBLE - java.lang.Double
MY_FLOAT - NUMERIC - NUMBER - java.lang.Double
MY_DOUBLE_PRECISION - NUMERIC - NUMBER - java.lang.Double
MY_REAL - NUMERIC - NUMBER - java.lang.Double
MY_FIXED_POINT_NUMBER - NUMERIC - NUMBER - java.math.BigDecimal
MY_NUMERIC - NUMERIC - NUMBER - java.math.BigDecimal
MY_DECIMAL - NUMERIC - NUMBER - java.math.BigDecimal
MY_DATE - TIMESTAMP - DATE - java.sql.Timestamp
MY_TIMESTAMP - TIMESTAMP - TIMESTAMP - oracle.sql.TIMESTAMP
MY_TIMESTAMP_WITH_TIME_ZONE - OracleTypes.TIMESTAMPTZ - TIMESTAMP WITH TIME ZONE - oracle.sql.TIMESTAMPTZ
Nom de colonne-Valeur de la colonne
my_char=Hello
my_varchar2=Hello
my_clob=oracle.sql.CLOB@7c711375
my_raw=[-54, -2, -70, -66]
my_blob=oracle.sql.BLOB@3a44431a
my_number_1=true
my_number_38=12345678901234567890123456789012345678
my_smallint=32767
my_integer=2147483647
my_binary_float=123.0001
my_binary_double=123.0001
my_float=123.0001
my_double_precision=123.0001
my_real=123.0001
my_fixed_point_number=123.0001
my_numeric=123.0001
my_decimal=123.0001
my_date=2001-02-03 04:05:06.0
my_timestamp=2001-02-02T19:05:06.999999999Z
my_timestamp_with_time_zone=2001-02-03T04:05:06.999999999Z
BUILD SUCCESSFUL in 16s
2 actionable tasks: 2 executed
Oracle Database JDBC Developer's Guide, 12c Release 2 \ (12 \ .2 ) \ -Accessing and Manipulating Oracle Data](https://docs.oracle.com/cd/E82638_01/jjdbc/accessing-and- manipuler-Oracle-data.html # GUID-EE0C380B-AB3E-4D1C-B02F-E3E599C72F91)
Comme le type de base de données BOOLEAN n'existe pas, une conversion de type de données est toujours effectuée lors de l'utilisation de getBoolean. La méthode getBoolean n'est prise en charge que pour les colonnes de nombres. Lorsque getBoolean est appliqué à ces colonnes, les valeurs 0 (zéro) sont interprétées comme false et toutes les autres valeurs sont interprétées comme true. Lorsqu'il est appliqué à un autre type de colonne, getBoolean renvoie l'exception java.lang.NumberFormatException.
Recommended Posts