Lista completa de tipos de dados JDBC
Além dos tipos de dados que você conhece, o JDBC permite que você trabalhe com muitos tipos de dados nativos para o DBMS. Abaixo listarei os tipos e as funções para obtê-los:
Tipo | Método |
---|---|
variedade | getArray() |
AsciiStreamName | getAsciiStream() |
BigDecimal | getBigDecimal() |
BinaryStream | getBinaryStream() |
bolha | getBlob() |
boleano | getBoolean() |
bolha | getBlob() |
boleano | getBoolean() |
bytes | getByte() |
bytes | getBytes() |
CharacterStream | getCharacterStream() |
Clob | getClob() |
Data | getDate() |
Dobro | getDouble() |
flutuador | getFloat() |
int | getInt() |
Longo | getLong() |
NCharacterStream | getNCharacterStream() |
Objeto | getObject() |
Ref. | getRef() |
RowId | getRowId() |
Curto | getShort() |
SQLXML | getSQLXML() |
Corda | getString() |
Tempo | consiga tempo() |
carimbo de data/hora | getTimestamp() |
UnicodeStream | getUnicodeStream() |
URL | getURL() |
Já consideramos tipos primitivos. Vamos agora tentar trabalhar com objetos.
tipo de dados BLOB
Se você deseja salvar algum objeto no banco de dados, a maneira mais fácil de fazer isso é usando o tipo SQL BLOB. JDBC tem sua contraparte chamada Blob.
BLOB significa Binary L arge Object . _ É usado para armazenar uma matriz de bytes. O tipo Blob em JDBC é uma interface e você pode colocar (e receber) dados nela de duas formas:
- Usando InputStream
- Usando uma matriz de bytes
Exemplo: a coluna número 3 contém o tipo BLOB:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
results.first();
Blob blob = results.getBlob(3);
InputStream is = blob.getBinaryStream();
Para criar seu próprio objeto Blob, você precisa usar a função createBlob() . Exemplo:
String insertQuery = “INSERT INTO images(name, image) VALUES (?, ?)”;
PreparedStatement statement = connection.prepareStatement(insertQuery);
// Create a Blob object and get an OtputStream from it to write data to it
Blob blob = connection.createBlob();
// Populate the Blob with data...
OutputStream os = blob.setBinaryStream(1);
// Passing Blob as query parameter
statement.setBlob(2, blob);
statement.execute();
Há duas maneiras de preencher um Blob com dados. O primeiro é via OutputSteam :
Path avatar = Paths.get("E:\\images\\cat.jpg");
OutputStream os = blob.setBinaryStream(1);
Files.copy(avatar, os);
E o segundo - através do preenchimento de bytes:
Path avatar = Paths.get("E:\\images\\cat.jpg");
byte[] content = Files.readAllBytes(avatar);
blob.setBytes(1, content);
Salvando um objeto Java em um banco de dados
Aprendemos como salvar objetos binários no banco de dados: matrizes de bytes, fluxos de bytes e assim por diante. E os objetos Java? Como salvamos um objeto Java em um banco de dados?
Digamos que temos uma classe Java Employee que descreve um funcionário de uma empresa:
public class Employee {
public Integer id;
public String name;
public String occupation;
public Integer salary;
public Date joinDate;
}
Como podemos salvar um objeto desta classe no banco de dados usando JDBC?
Na verdade, você já sabe tudo o que precisa saber. Primeiro você precisa criar uma tabela no banco de dados que corresponda a esta classe. Por exemplo, este:
CREATE TABLE employee {
id INT PRIMARY KEY NOT NULL,
name VARCHAR(100),
occupation VARCHAR(100),
salary INT,
join_date DATE
}
E agora vamos escrever o código que irá adicionar um objeto da nossa classe Employee à base:
public static boolean addEmployee(Connection connection, Employee employee) throws Exception {
// Create and prepare a query to insert data into the table
String insertQuery = "INSERT INTO employee(name, occupation, salary, join_date ) VALUES (?, ?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(insertQuery);
// Populate the query with data from the Employee object
statement.setString(1, employee.name);
statement.setString(2, employee.occupation);
statement.setInt(3, employee.salary);
statement.setDate(4, employee.joinDate);
// Execute our query and it returns true if a new row has been added
int count = statement.executeUpdate();
return count > 0;
}
Simples e claro. O método funcionará muito bem.
Lendo um objeto Java de um banco de dados
Aprendemos como escrever um objeto no banco de dados, agora vamos escrever o código para ler o objeto do banco de dados. Vamos começar com o código que lê um objeto do banco de dados pelo seu ID:
public static Employee getEployeeById(Connection connection, int id) throws Exception {
// Create and prepare a query to get an employee from the table
PreparedStatement statement = connection.prepareStatement("SELECT * FROM employee WHERE id = ?");
statement.setInt(1, id);
// Execute our query and it returns null if there are no rows in the query result
ResultSet results = statement.executeQuery();
if (!results.first())
return null;
// Populate the Employee object with the data from the ResultSet
Employee employee = new Employee();
employee.id = results.getInt(1);
employee.name = results.getString(2);
employee.occupation = results.getString(3);
employee.salary = results.getInt(4);
employee.joinDate = results.getDate(5);
return employee;
}
E se não precisarmos de um objeto, mas de vários? Esse pedido também é fácil de escrever. Vamos pegar todos os funcionários da nossa empresa:
public static List<Employee> getAllEployees(Connection connection) throws Exception {
// Create and execute a query to get employees from the table
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM employee");
ArrayList<Employee> list = new ArrayList<Employee>();
while (results.next()) {
// Populate the Employee object with the data from the current row of the ResultSet
Employee employee = new Employee();
employee.id = results.getInt(1);
employee.name = results.getString(2);
employee.occupation = results.getString(3);
employee.salary = results.getInt(4);
employee.joinDate = results.getDate(5);
list.add(employee);
}
return list;
}
A propósito, se houver muitos desses métodos, em cada um deles você terá que escrever o mesmo código para converter a string ResultSet em um objetofuncionário. Portanto, esse código pode ser movido para um método separado.
Isso pode ser especialmente útil se a classe Employee contiver campos complexos como Enum, InputStream ou referências a outros objetos que também desejamos armazenar no banco de dados.
GO TO FULL VERSION