Você está na página 1de 10

JDBC

1 Introduo
Java certamente um mercado com grandes oportunidades. Essa popularidade no aconteceu por acaso. Ao criar um projecto com Java ganha-se muita liberdade. O sistema fica independente de vrios fabricantes de hardware, de software, da base de dados, at mesmo do fabricante da virtual machine. Alm disso, possvel fazer todo o desenvolvimento num sistema operativo e fazer deploy num outro. Apesar de tanta popularidade, o desenvolvimento com Java no se tornou trivial. necessrio conhecer com certa profundidade as APIs, mesmo o projecto utilize frameworks tais como struts, Vraptor ou JSF. Este curso aborda desde base de dados at o uso de frameworks MVC para separao de cdigo. Veremos ainda o SpringMVC e o Hibernate, duas ferramentas essenciais para programadores Java.

2 Base de dados e JDBC


No final deste captulo, voc ser capaz de: 1. Conectar-se a uma base de dados atravs da API JDBC 2. Criar uma fbrica de conexes usando o design pattern Factory 3. Pesquisar dados atravs de queries 4. Encapsular as operaes com base de dados atravs de DAO Data Access Object

2.1 Porqu usar Base de dados?


Os sistemas precisam manter as informaes com as quais trabalham para permitir consultas futuras, gerao de relatrios ou possveis alteraes na informaes. Para que esses dados sejam mantidos para sempre, geralmente guarda-se essas informaes numa base de dados que as mantm de forma organizada e pronta para consultas. A maioria das bases de dados conhecidas so chamadas de relacionais, que uma forma de trabalhar e pensar diferente do paradigma orientado a objectos. Neste curso iremos usar a base de dados MySQL, uma das mais populares base de dados relacionais. gratuita e de fcil instalao para todos sistemas operativos. Depois de instalado, podemos acede-la via terminal da seguinte forma: mysql -u root Para quem no conhece uma base de dados, recomendado ler um pouco sobre o assunto e tambm ter uma base de SQL para comear a usar a API JDBC. O processo de armazenamento de dados tambm chamado de persistncia. A livraria de persistncia em base de dados relacionais do Java chamada JDBC. Existem diversas ferramentas do tipo ORM (Object Relational Mapping) que facilitam bastante o uso de JDBC.

2.2 Persistncia atravs de sockets


Para conectar-se a uma base de dados poderamos abrir sockets directamente com o servidor que o hospeda, por exemplo um Oracle ou MySQL e nos comunicarmos com atravs do seu protocolo proprietrio. Mas voc conhece o protocolo proprietrio de alguma base de dados? Conhecer um protocolo complexo em profundidade difcil e muito trabalhoso. Uma segunda ideia seria utilizar uma API especfica para cada base de dados. Antigamente, no PHP por exemplo, a nica maneira de aceder ao Oracle era atravs de funes como oracle_connect, oracle_result e assim por diante. O MySQL tinha suas funes anlogas, como mysql_connect. Essa abordagem facilita muito o nosso trabalho porque no precisamos conhecer o protocolo de cada base de dados, mas faz com que tenhamos de conhecer uma API um pouco diferente para cada base de dados. Alm disso, se um dia precisarmos trocar de base de dados, precisaramos alterar nosso cdigo para reflectir a funo correcta de acordo com a nova base de dados que est a ser usada.

2.3 Persistncia atravs de JDBC


Para evitar que cada base de dados tenha a sua prpria API, conjunto de classes e mtodos, o java tem um nico conjunto de interfaces muito bem definidas que devem ser implementadas. Este conjunto de interfaces fica dentro do pacote java.sql e chamamos de JDBC. Para abrir uma conexo com uma base de dados, precisamos utilizar sempre um driver. A classe DriverManager a responsvel por comunicar com todos os drivers disponveis. Para isso, invocamos o mtodo esttico getConnection com uma String que indica a qual a base de dados desejamos conectar. Essa String - chamada de String de conexo JDBC - que utilizaremos para aceder ao MySQL tem sempre o seguinte formato: jdbc:mysql://ip/nome_do_banco Devemos substituir ip pelo IP da mquina do servidor e nome_do_banco pelo nome da base de dados

a ser utilizado. Execute o exemplo abaixo:


public class JDBCExemplo { public static void main(String[] args) throws SQLException { Connection conexao = DriverManager.getConnection( "jdbc:mysql://localhost/mysqldb"); System.out.println("Conectado!"); conexao.close(); } }

2.4 Fbrica de Conexes


Por vezes, queremos controlar um processo muito repetitivo e trabalhoso, como abrir uma conexo com o banco de dados. Vejamos o exemplo da classe a seguir que seria responsvel por abrir uma conexo com a base de dados:
public class ConnectionFactory { public Connection getConnection() { try { return DriverManager.getConnection( "jdbc:mysql://localhost/mysqldb", "root", ""); } catch (SQLException e) { throw new RuntimeException(e); }

} }

Repare que o mtodo getConnection() uma fbrica de conexes, isto , ele cria novas conexes. Basta invocar o mtodo e recebemos uma conexo pronta para uso, no importando de onde vem e eventuais detalhes de criao. Portanto, vamos chamar a classe de ConnectionFactory e o mtodo de getConnection.

Crie uma classe TestaConexo com o seguinte main:


Connection connection = new ConnectionFactory().getConnection(); System.out.println("Conexo aberta!"); connection.close();

2.5 Manipulao da base de dados


Crie a seguinte tabela na base de dados:
create table contatos ( id BIGINT NOT NULL AUTO_INCREMENT, nome VARCHAR(255), email VARCHAR(255), endereco VARCHAR(255), dataNascimento DATE, primary key (id) );

Inserir na base de dados


Para inserir dados numa tabela de uma base de dados relacional usamos a clusula INSERT. Precisamos especificar os campos que desejamos actualizar e os valores. Primeiro o cdigo SQL: String sql = "insert into contatos " + "(nome,email,endereco, dataNascimento)" + " values ('" + nome + "', '" + email + "', '" + endereco + "', '"+ dataNascimento +"')"; O exemplo acima possui trs pontos negativos que so importantssimos. O primeiro que um outro programador, que no quem escreveu o cdigo original no consegue de primeira entender o que est escrito. O que o cdigo acima faz? Lendo rapidamente fica difcil. Mais difcil ainda saber se faltou uma vrgula, um parnteses talvez? E ainda assim, esse um caso simples. Existem tabelas com 10, 20, 30 e at mais campos, tornando invivel entender o que est escrito no SQL misturado com as concatenaes. Outro problema o clssico preconceito contra Joana Darc, formalmente chamado de SQL Injection. O que acontece quando o contacto a ser adicionado possui no nome uma aspas simples? O cdigo SQL se quebra todo e para de funcionar ou, pior ainda, o usurio final capaz de alterar seu cdigo sql para executar aquilo que ele deseja (SQL injection)... tudo isso porque escolhemos aquela linha de cdigo e no fizemos o escape de caracteres especiais. A data tambm um problema. Ela precisa ser passada no formato que o banco de dados entenda e como uma String, portanto, se voc possui um objeto java.util.Calendar que o nosso caso, voc precisar fazer a converso desse objeto para a String. Vamos imaginar algo mais genrico e um pouco mais interessante:

String sql = "insert into contatos " + "(nome,email,endereco,dataNascimento) " + "values (?,?,?,?)"; No colocamos os pontos de interrogao por acaso, mas sim porque realmente no sabemos o que desejamos inserir. Estamos interessados em executar aquele cdigo mas no sabemos ainda quais so os parmetros que utilizaremos nesse cdigo SQL que ser executado, chamado de statement. Veja o exemplo abaixo, que abre uma conexo e insere um contacto no banco: public class JDBCInsere { public static void main(String[] args) throws SQLException { // conectando Connection con = new ConnectionFactory().getConnection(); // cria um preparedStatement String sql = "insert into contatos" + " (nome,email,endereco,dataNascimento)" + " values (?,?,?,?)"; PreparedStatement stmt = con.prepareStatement(sql); // preenche os valores stmt.setString(1, "Cenfoss"); stmt.setString(2, "contato@cenfoss.co.mz");

stmt.setString(3, "Av. Eduardo Mondlane, 2341"); stmt.setDate(4, new java.sql.Date( Calendar.getInstance().getTimeInMillis())); // executa stmt.execute(); stmt.close(); System.out.println("Gravado!"); con.close(); } } No comum utilizar JDBC directamente hoje em dia. O mais praticado o uso de alguma API de ORM como o Hibernate ou JPA. Tanto na JDBC quanto em bibliotecas ORM deve-se prestar ateno no momento de fechar a conexo. O exemplo anterior no a fecha caso algum erro ocorra no momento de inserir um dado no banco de dados. O comum fechar a conexo em um bloco finally: public class JDBCInsere { public static void main(String[] args) throws SQLException { Connection con = null; try { con = new ConnectionFactory().getConnection();

// faz um monte de operaes. // que podem lanar exceptions runtime e SQLException catch(SQLException e) { System.out.println(e); } finally { con.close(); } } }

Você também pode gostar