Exemplo JDBI

Como já comentado no artigo anterior, JDBI é uma forma de implementar seu DAO com mais produtividade, uma biblioteca para se trabalhar SQL e banco de dados relacionais.
Então vamos criar um simples DAO para realizar operações CRUD(Create, Read, Update e Delete).
Para esse exemplo é necessário possuir o MySQL em execução na sua máquina com o esquema teste criado.

No maven (pom.xml) de seu projeto Java, adicione as dependências do JDBI versão 2.73 , do MYSQL 5.1.38 e Junit versão 4.12 para nossos testes unitários.

                <!-- JDBI-->
		<dependency>
			<groupId>org.jdbi</groupId>
			<artifactId>jdbi</artifactId>
			<version>${jdbi.version}</version>
		</dependency>

                <!-- MySQL -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>
		</dependency>

                <!-- JUNIT -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>

Criaremos uma interface de nome MyDAO:

public interface MyDAO {}

Agora que temos nossa classe criada, podemos então criar nossos métodos CRUD, vamos implementar uma INSERT, SELECT, UDPATE e DELETE para tabela do MySQL TBLEXEMPLO conforme métodos abaixo:

public interface MyDAO
{
	//Cria tabela TBLEXEMPLO no banco
	@SqlUpdate("CREATE TABLE IF NOT EXISTS TBLEXEMPLO (ID int NOT NULL AUTO_INCREMENT, name varchar(100) NOT NULL, PRIMARY KEY (ID))")
	void createTable();

	//Insere registro no banco na tabela TBLEXEMPLO
	@SqlUpdate("insert into TBLEXEMPLO (name) values (:name)")
	void insert(@Bind("name") String name);

	//filtra no banco da tabela TBLEXEMPLO
	@SqlQuery("select ID from TBLEXEMPLO where name = :name")
	int findIdByName(@Bind("name") String name);

	//filtra no banco da tabela TBLEXEMPLO
	@SqlQuery("select name from TBLEXEMPLO where id = :id")
	String findNameById(@Bind("id") int id);

	//Altera registro no banco na tabela TBLEXEMPLO
	@SqlUpdate("update TBLEXEMPLO set name = :name where id = :id")
	int updateNameById(@Bind("id") int id, @Bind("name") String name);

	//Apaga registro no banco na tabela TBLEXEMPLO
	@SqlUpdate("delete from TBLEXEMPLO where id = :id")
	int deleteById(@Bind("id") int id);

	//Apaga tabela após conclusão de testes
	@SqlUpdate("drop table TBLEXEMPLO")
	void dropTable();

	//Finaliza conexão
	void close();
}

As anotações @SqlUpdate servem para realizar operações de escrita no branco de dados, em quanto as anotações @SqlQuery para leitura, como SELECT.

Abaixo o código que realiza os testes unitários.

public class MyDAOTest {

	@Test
	public void testJdbi() {
		MyDAO dao = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			//Realiza conexão com o mysql
			DBI dbi = new DBI("jdbc:mysql://localhost/test", "usuario", "senha");
			//Abra conexão com o MySQL
			dao = dbi.open(MyDAO.class);
			//Cria tabela
			dao.createTable();
			//Insere Registro com nome Rezebde
			dao.insert("Rezende");
			int id = dao.findIdByName("Rezende");
			//Nome retornado da consulta deve ser Rezende
			assertEquals(1, id);
			//Altera nome de Rezende para Rezende2
			dao.updateNameById(id, "Rezende2");
			String name2 = dao.findNameById(id);
			//Nome retornado deve ser Rezende2
			assertEquals("Rezende2", name2);

			//Apaga registro criado
			dao.deleteById(id);
			String name3 = dao.findNameById(id);
			//Valor retornado deve ser nulo, pois registro foi apagado acima
			assertNull(name3);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			fail("Error");
		} finally {
			if (dao != null) {
				// Apaga tabela
				dao.dropTable();
				dao.close();
			}
		}
	}
}

Executando os testes acima, não deverá retornar erro.

O download do projeto pode ser feito em meu github: https://github.com/andremrezende/jdbi-example.git

Como visto no post, é muito rápido implementar a camada de persistência utilizando o JDBI e chamadas nativas no banco de dados desejado.