CodeGym/Cursos Java/All lectures for PT purposes/Negociação de tipo de dados em JDBC

Negociação de tipo de dados em JDBC

Disponível

Tipos de dados

Vamos dar uma olhada na tabela:

"C:\Arquivos de Programas\Java\jdk-17.0.3.1\bin\java.exe...
eu ia java.lang.Integer INT 4
nome java.lang.string VARCHAR 12
nível java.lang.Integer INT 4
Data de criação java.sql.date DATA 91
Processo finalizado com código de saída 0

Na terceira coluna vemos os tipos: INT , VARCHAR , DATE . Esses são os tipos de servidor SQL. Os meios do servidor fornecem os dados com aqueles tipos sobre os quais ele conhece. Como esses tipos são convertidos em tipos Java?

Esta é exatamente uma das coisas que foram padronizadas com o JDBC. Os criadores do JDBC começaram corrigindo uma lista de tipos SQL. Existe uma classe especial com constantes:

class java.sql.Types {
   public static final int CHAR         =   1;
   public static final int NUMERIC    	=   2;
   public static final int DECIMAL     	=   3;
   public static final int INTEGER      =   4;
   public static final int FLOAT        =   6;
   public static final int REAL         =   7;}

O número não é um número de série na classe, mas um tipo de ID na lista de tipos SQL na especificação SQL. Estes são os números que você viu no exemplo no início da palestra.

Também na classe ResultSet existem métodos que podem converter um tipo de dados em outro. Nem todos os tipos podem ser convertidos entre si, mas a lógica é clara o suficiente. Aqui está uma boa planilha para você:

Método Tipo de dados SQL
int getInt() NUMÉRICO, INTEIRO, DECIMAL
float getFloat() NUMÉRICO, INTEIRO, DECIMAL, FLOAT, REAL
double getDoublel() NUMÉRICO, INTEIRO, DECIMAL, FLOAT, REAL
Data getDate() DATA, HORA, TIMESTAMP
Hora getTime() DATA, HORA, TIMESTAMP
Timestamp getTimestamp() DATA, HORA, TIMESTAMP
String getString() CHAR, VARCHAR

Entre todos os tipos de SQL, alguns grupos podem ser claramente distinguidos:

  • números
  • tempo
  • linhas
  • objetos de bytes

A propósito, você notou o método getInt() ?

JDBC e NULL

Você notou o que há de errado com o método getInt() da classe ResultSet ? Vejamos sua assinatura novamente:

int getInt(column)

Este método retorna um int , não um Integer. Porque na época que o JDBC tipo Integer foi criado, ele ainda não existia. Ok, digamos. Então eu tenho uma pergunta:

Eu tenho uma tabela em um banco de dados que possui uma coluna INT NULL que pode ser INT, mas também pode ser NULL. Como posso obter o valor nulo desta coluna?

Não se preocupe, tudo foi pensado para você.

Solução um . Se o tipo SQL em Java for representado por um tipo de referência como Date ou String, não há problema . Variáveis ​​desse tipo podem assumir valores nulos.

Solução dois . Tipos primitivos não podem ser nulos, então métodos como getInt() irão simplesmente retornar um valor padrão . Para int é 0, para float = 0.0f, para double = 0.0d e assim por diante.

E como então entender o que estava na coluna: 0 ou NULL? E o partido tem uma resposta para essa pergunta.

Solução três . A classe ResultSet tem um método especial wasNull() que retorna true se o método apenas retornou um valor diferente em vez de NULL .

Tudo funciona exatamente como escrevi aqui. Exemplo:

ResultSet results = staatement.executeQuery("SELECT * FROM user");
    int level = results.getInt("level");

if (results.wasNull()) {
    System.out.println("Level is null");
} else {
   System.out.println("Level is " + level);
    }

Se fosse para retornar nulo ao chamar o método getInt() , o método wasNull() retornaria true, caso contrário, o método wasNull() retornaria false.

Isso funciona não apenas para tipos primitivos:

ResultSet results = staatement.executeQuery("SELECT * FROM user");
    String name = results.getString("name");

 	if (results.wasNull()) {
 	    System.out.println("Name is null");
 	} else {
 	   System.out.println("User name is " + name);
    }

Claro que isso é uma muleta. Mas não há problema com NullPointerException . Veja os aspectos positivos em tudo :)

O que há de errado com os tipos de dados no JDBC?

Vamos continuar com o teste. Observe atentamente o método getDate(column) ? O que há de errado com ele? Este método tem o seguinte tipo de resultado:

java.sql.Date

Ele pode armazenar null, o que é bom o suficiente. Mas ainda assim, algo está errado com ele. Dica! Aqui está a aparência do tipo Date correto:

java.util.Date

Eles têm pacotes diferentes! Estes são geralmente diferentes tipos de dados. E aqui está o motivo...

Os bancos de dados desde os anos 70 do século XX suportam 3 tipos de dados para armazenar o tempo:

  • DATA - armazena a data: ano, mês, dia.
  • TIME - armazena o tempo: horas, minutos, segundos.
  • TIMESTAMP - armazena um ponto específico no tempo: data, hora e milissegundos.

A linguagem Java durante os primeiros 10 anos de sua existência tinha apenas um tipo de dados, java.util.Date , que armazenava um ponto no tempo no formato UNIX TIME: o número de milissegundos desde o início de 1970.

Portanto, os criadores do padrão JDBC adicionaram mais três tipos de dados ao Java - especificamente para JDBC:

  • java.sql.date
  • java.sql.Time
  • java.sqlTimestamp

E assim os métodos da interface ResultSet contêm tipos de dados fixos:

TIPO SQL Tipo Java Método
DATA java.sql.date java.sql.date getDate()
TEMPO java.sql.Time java.sql.Time getTime()
TIMESTAMP java.sql.timestamp java.sql.Timestamp getTimestamp()

E este é o tipo que você vê aqui:

"C:\Arquivos de Programas\Java\jdk-17.0.3.1\bin\java.exe...
eu ia java.lang.Integer INT 4
nome java.lang.string VARCHAR 12
nível java.lang.Integer INT 4
Data de criação java.sql.date DATA 91
Processo finalizado com código de saída 0

Adivinha o que está faltando aqui? Tipos de dados que apareceram na API Java DateTime:

  • LocalData
  • Horário local
  • LocalDateTime
Comentários
  • Populares
  • Novas
  • Antigas
Você precisa acessar para deixar um comentário
Esta página ainda não tem nenhum comentário