Usando tipos de dados básicos

Baixar driver JDBC

O Microsoft JDBC Driver para SQL Server usa os tipos de dados básicos JDBC para converter os tipos de dados do SQL Server em um formato compreendido pela linguagem de programação Java e vice-versa. O driver JDBC fornece suporte para a API JDBC 4.0, que inclui o tipo de dados SQLXML e os tipos de dados National (Unicode), como NCHAR, NVARCHAR, LONGNVARCHAR e NCLOB.

Mapeamentos de tipo de dados

A tabela a seguir lista os mapeamentos padrão entre os tipos de dados básicos do SQL Server, JDBC e linguagem de programação Java:

Tipos de SQL Server Tipos JDBC (java.sql.Types) Tipos de linguagem Java
bigint BIGINT long
binário BINARY byte[]
pouco POUCO Booleano
char CHAR Cordão
date DATE java.sql.Data
datetime3 DATA E HORA java.sql.Carimbo de data/hora
datetime2 DATA E HORA java.sql.Carimbo de data/hora
datetimeoffset2 microsoft.sql.Types.DATETIMEOFFSET microsoft.sql.DateTimeOffset
decimal DECIMAL java.math.BigDecimal
float DUPLO duplo
geometria VARBINARY byte[]
geografia VARBINARY byte[]
imagem LONGVARBINARY byte[]
int INTEGER int
Json microsoft.sql.Types.JSON Cordão
dinheiro DECIMAL java.math.BigDecimal
Nchar CHAR

NCHAR (Java SE 6.0)
Cordão
ntexto LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
Cordão
numérico NUMÉRICO java.math.BigDecimal
Nvarchar VARCHAR

NVARCHAR (Java SE 6.0)
Cordão
nvarchar (máx.) VARCHAR

NVARCHAR (Java SE 6.0)
Cordão
real REAL float
smalldatetime DATA E HORA java.sql.Carimbo de data/hora
Smallint SMALLINT curtas
dinheiro pequeno DECIMAL java.math.BigDecimal
SQLVARIANT microsoft.sql.Types.SQL_VARIANTE Objeto
enviar SMS LONGVARCHAR Cordão
time TEMPO1 java.sql.Time1
carimbo de data/hora BINARY byte[]
tinyint TINYINT curtas
UDT VARBINARY byte[]
uniqueidentifier CHAR Cordão
Varbinary VARBINARY byte[]
varbinário (máx.) VARBINARY byte[]
Varchar VARCHAR Cordão
varchar (máx.) VARCHAR Cordão
vetor microsoft.sql.Types.VETOR microsoft.sql.Vetor
XML LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
Cordão

SQLXML

1 Para usar java.sql.Time com o tipo de SQL Server de hora, você deve definir a propriedade de conexão sendTimeAsDatetime como false.

2 Você pode acessar programaticamente valores de datetimeoffset com DateTimeOffset Class.

3 java.sql.Os valores de carimbo de data/hora não podem mais ser usados para comparar valores de uma coluna datetime a partir do SQL Server 2016. Esta limitação deve-se a uma alteração do lado do servidor que converte datetime em datetime2 de forma diferente, resultando em valores não iguais. A solução alternativa para esse problema é alterar colunas datetime para datetime2(3), usar String em vez de java.sql.Timestamp ou alterar o nível de compatibilidade do banco de dados para 120 ou inferior.

As seções a seguir fornecem exemplos de como você pode usar o JDBC Driver e os tipos de dados básicos. Para obter um exemplo mais detalhado de como usar os tipos de dados básicos em um aplicativo Java, consulte Exemplo de tipos de dados básicos.

Recuperando dados como uma cadeia de caracteres

Para ler valores mapeados para qualquer tipo básico JDBC como uma cadeia de caracteres ou quando um valor fortemente tipado não é necessário, use o método getString da classe SQLServerResultSet . O exemplo a seguir mostra esse uso:

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getString("job_id");
}

Recuperando dados por tipo de dados

Se você precisar recuperar dados de uma fonte de dados e souber o tipo de dados que está sendo recuperado, use um dos métodos get<Type> da classe SQLServerResultSet, também conhecida como métodos getter. Você pode usar um nome de coluna ou um índice de coluna com os métodos get<Type> , como no exemplo a seguir:

try(Statement stmt = con.createStatement();) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    short empJobID = rs.getShort("job_id");
}

Observação

Os métodos getUnicodeStream e getBigDecimal com escala foram preteridos e não são suportados pelo driver JDBC.

Atualização de dados por tipo de dados

Se você precisar atualizar o valor de um campo em uma fonte de dados, use um dos métodos Update<Type> da classe SQLServerResultSet. No exemplo a seguir, o método updateInt é usado com o método updateRow para atualizar os dados na fonte de dados:

try (Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);) {
    ResultSet rs = stmt.executeQuery("SELECT lname, job_id FROM employee WHERE (lname = 'Brown')");
    rs.next();
    int empJobID = rs.getInt(2);
    empJobID++;
    rs.first();
    rs.updateInt(2, empJobID);
    rs.updateRow();
}

Observação

O driver JDBC não pode atualizar uma coluna do SQL Server com um nome de coluna com mais de 127 caracteres. Se uma atualização para uma coluna cujo nome tem mais de 127 caracteres for tentada, uma exceção será lançada.

Atualizando dados por consulta parametrizada

Se você atualizar dados em uma fonte de dados usando uma consulta parametrizada, poderá definir o tipo de dados dos parâmetros usando um dos métodos set<Type> da classe SQLServerPreparedStatement . Esses métodos também são conhecidos como métodos setter. No exemplo a seguir, o método prepareStatement é usado para pré-compilar a consulta parametrizada e, em seguida, o método setString é usado para definir o valor da cadeia de caracteres do parâmetro antes que o método executeUpdate seja chamado.

try(PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET fname = ? WHERE (lname = 'Brown')");) {
    String name = "Bob";
    pstmt.setString(1, name);
    int rowCount = pstmt.executeUpdate();
}

Para obter mais informações sobre consultas parametrizadas, consulte Usando uma instrução SQL com parâmetros.

Passando parâmetros para um procedimento armazenado

Se você tiver que passar parâmetros digitados para um procedimento armazenado, você pode definir os parâmetros por índice ou nome usando um dos métodos set<Type> da classe SQLServerCallableStatement . No exemplo a seguir, o método prepareCall é usado para configurar a chamada para o procedimento armazenado e, em seguida, o método setString é usado para definir o parâmetro para a chamada antes que o método executeQuery seja chamado.

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid(?)}");) {
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();
}

Observação

Neste exemplo, um conjunto de resultados é retornado com os resultados da execução do procedimento armazenado.

BigDecimal

Ao usar valores de parâmetros BigDecimal, a precisão e a escala podem ser passadas junto com o valor através do setBigDecimal. O uso setBigDecimal dessa forma evita o truncamento de valor potencial. Como alternativa, se a opção calcBigDecimalPrecision de cadeia de conexão estiver definida como true, o driver calculará a precisão para a entrada BigDecimal em nome do usuário, ao custo do desempenho. Se o valor for passado sozinho, sem calcBigDecimalPrecision definido, ou a opção definida como false, o driver assume o valor máximo permitido (38) para precisão para esse valor BigDecimal.

Para obter mais informações sobre como usar o driver JDBC com procedimentos armazenados e parâmetros de entrada, consulte Usando um procedimento armazenado com parâmetros de entrada.

Recuperando parâmetros de um procedimento armazenado

Se você tiver que recuperar parâmetros de volta de um procedimento armazenado, você deve primeiro registrar um out parâmetro por nome ou índice usando o método registerOutParameter da classe SQLServerCallableStatement. Em seguida, atribua o parâmetro retornado a uma variável apropriada depois de executar a chamada para o procedimento armazenado. No exemplo a seguir, o método prepareCall é usado para configurar a chamada para o procedimento armazenado, o método registerOutParameter é usado para configurar o out parâmetro e, em seguida, o método setString é usado para definir o parâmetro para a chamada antes que o método executeQuery seja chamado. O valor do parâmetro do procedimento armazenado é recuperado out usando o método getShort .

try(CallableStatement cstmt = con.prepareCall("{call employee_jobid (?, ?)}");) {
    cstmt.registerOutParameter(2, java.sql.Types.SMALLINT);
    String lname = "Brown";
    cstmt.setString(1, lname);
    ResultSet rs = cstmt.executeQuery();
    short empJobID = cstmt.getShort(2);
}

Observação

Além do parâmetro retornado, um conjunto de resultados também pode ser retornado com os resultados da execução do procedimento armazenado.

Para obter mais informações sobre como usar o driver JDBC com procedimentos armazenados e parâmetros de saída, consulte Usando um procedimento armazenado com parâmetros de saída.

Consulte também

Noções básicas sobre os tipos de dados do driver JDBC