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.