Como usar 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 que pode ser compreendido pela linguagem de programação Java e vice-versa. O JDBC Driver dá suporte à API do JDBC 4.0, que inclui o tipo de dados SQLXML e tipos de dados Nacionais (Unicode), como NCHAR, NVARCHAR, LONGNVARCHAR e NCLOB.

Mapeamentos de tipo de dados

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

Tipos de SQL Server Tipos JDBC (java.sql.Types) Tipos da linguagem Java
BIGINT bigint long
binary BINARY byte[]
bit BIT booleano
char CHAR String
date DATE java.sql.Date
datetime3 timestamp java.sql.Timestamp
datetime2 timestamp java.sql.Timestamp
datetimeoffset2 microsoft.sql.Types.DATETIMEOFFSET microsoft.sql.DateTimeOffset
decimal DECIMAL java.math.BigDecimal
FLOAT DOUBLE double
image LONGVARBINARY byte[]
INT INTEGER INT
money DECIMAL java.math.BigDecimal
NCHAR CHAR

NCHAR (Java SE 6.0)
String
ntext LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String
numeric NUMERIC java.math.BigDecimal
NVARCHAR VARCHAR

NVARCHAR (Java SE 6.0)
String
nvarchar(max) VARCHAR

NVARCHAR (Java SE 6.0)
String
real real FLOAT
smalldatetime timestamp java.sql.Timestamp
SMALLINT SMALLINT short
SMALLMONEY DECIMAL java.math.BigDecimal
text LONGVARCHAR String
time TIME1 java.sql.Time1
timestamp BINARY byte[]
TINYINT TINYINT short
udt VARBINARY byte[]
UNIQUEIDENTIFIER CHAR String
varbinary VARBINARY byte[]
varbinary(max) VARBINARY byte[]
varchar VARCHAR String
varchar(max) VARCHAR String
Xml LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)
String

SQLXML
sqlvariant microsoft.sql.Types.SQL_VARIANT Objeto
geometria VARBINARY byte[]
geografia VARBINARY byte[]

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

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

3 Observe que os valores java.sql.Timestamp não podem mais ser usados para comparar valores de uma coluna datetime no SQL Server 2016. Essa limitação se deve a uma alteração no lado do servidor que converte datetime em datetime2 de modo diferente, resultando em valores não justos. A solução alternativa para esse problema é alterar as 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 menos.

As seções a seguir fornecem exemplos de como é possível usar o JDBC Driver e os tipos de dados básicos. Para obter exemplos mais detalhados sobre como usar os tipos de dados básicos em um aplicativo Java, veja Amostra de tipos e dados básicos.

Recuperando dados como uma cadeia de caracteres

Se desejar recuperar dados de uma fonte de dados que mapeia para um dos tipos de dados básicos do JDBC para ser exibido como uma cadeia de caracteres, ou se não for necessário usar dados com rigidez de tipos, você poderá usar o método getString da classe SQLServerResultSet, da seguinte maneira:

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 tiver que recuperar dados de uma fonte de dados e souber o tipo de dados que estão sendo recuperados, use um dos métodos get<Type> da classe SQLServerResultSet, também conhecidos como métodos getter. Você pode usar um nome de coluna ou um índice de coluna com os métodos get<Type>, da seguinte maneira:

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 são substituídos e não têm suporte no JDBC Driver.

Atualizando dados por tipo de dados

Se você tiver que 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 junto 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 você tentar fazer uma atualização para uma coluna cujo nome tem mais de 127 caracteres, uma exceção será lançada.

Atualizando dados por consulta parametrizada

Se você tiver que 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, também conhecidos como métodos setter. No exemplo a seguir, o método prepareStatement é usado para pré-compilar a consulta parametrizada e o método setString é usado para definir o valor da cadeia de caracteres do parâmetro antes de o método executeUpdate ser chamado.

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

Confira mais informações sobre consultas parametrizadas em Como usar uma instrução SQL com parâmetros.

Passando parâmetros para um procedimento armazenado

Se você tiver que passar parâmetros de tipo em um procedimento armazenado, poderá definir os parâmetros através de índice ou pode nomear usando um dos métodos set<Type> da classe SQLServerCallableStatement. No exemplo a seguir, o método prepareCall é usado para configurar a chamada ao procedimento armazenado e o método setString é usado para definir o parâmetro para a chamada antes de o método executeQuery ser 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.

Confira mais informações sobre como usar o JDBC Driver com procedimentos armazenados e parâmetros de entrada em Como usar um procedimento armazenado com parâmetros de entrada.

Recuperando parâmetros de um procedimento armazenado

Se você tiver que recuperar parâmetros de um procedimento armazenado, primeiro registre um parâmetro OUT por nome ou índice usando o método registerOutParameter da classe SQLServerCallableStatement e, em seguida, atribua o parâmetro OUT retornado a uma variável apropriada depois de executar a chamada ao procedimento armazenado. No exemplo a seguir, o método prepareCall é usado para configurar a chamada ao procedimento armazenado, o método registerOutParameter é usado para configurar o parâmetro OUT e o método setString é usado para definir o parâmetro para a chamada antes de o método executeQuery ser chamado. O valor retornado pelo parâmetro OUT do procedimento armazenado é recuperado 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 OUT retornado, um conjunto de resultados também pode ser retornado com os resultados da execução do procedimento armazenado.

Confira mais informações sobre como usar o JDBC Driver com procedimentos armazenados e parâmetros de saída em Como usar um procedimento armazenado com parâmetros de saída.

Confira também

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