Usando tipos de dados básicos
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();
}
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 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.