Usando tipos de dados básicos

Baixar o JDBC Driver

O Microsoft JDBC Driver para SQL Server usa os tipos de dados básicos do JDBC para converter os tipos de dados do SQL Server em um formato reconhecido 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 regionais (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 de maneira programática os valores de datetimeoffset com DateTimeOffset Class.

3 Os valores java.sql.Timestamp não podem mais ser usados para comparar valores de uma coluna datetime começando no SQL Server 2016. Essa limitação se deve a uma alteração interna do servidor que converte datetime em datetime2 de forma diferente, resultando em valores desiguais. 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 string

Se você precisar recuperar dados de uma fonte de dados que mapeie qualquer um dos tipos de dados básicos do JDBC para serem exibidos como uma string, ou se não forem necessários dados fortemente tipados, use o método getString da classe SQLServerResultSet. O exemplo a seguir demonstra 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ã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ê 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 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

Caso precise atualizar dados em uma fonte de dados usando uma consulta parametrizada, você 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 é utilizado para pré-compilar a consulta parametrizada, e o método setString é usado para definir o valor da string 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();
}

Veja 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, foi retornado um conjunto de resultados juntamente com os resultados da execução do procedimento armazenado.

BigDecimal

Ao usar valores de parâmetro BigDecimal, a precisão e a escala podem ser passadas junto com o valor por meio de setBigDecimal. A utilização de setBigDecimal dessa maneira evita o truncamento de valores potenciais. Como alternativa, se a opção de cadeia de conexão calcBigDecimalPrecision estiver definida como true, o driver calculará a precisão da entrada BigDecimal em nome do usuário, às custas do desempenho. Se o valor for passado sozinho, sem calcBigDecimalPrecision definido ou a opção definida como false, o driver assumirá o valor máximo permitido (38) para precisão desse valor BigDecimal.

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ê precisar recuperar parâmetros de um procedimento armazenado, você deve primeiro registrar um parâmetro out por nome ou índice usando o método registerOutParameter da classe SQLServerCallableStatement. Em seguida, atribua o parâmetro OUT 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 parâmetro out, e 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 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