Nesta aula vamos aprender a fazer um programa em Java que faça uma conexão com um banco de dados.
O banco de dados que vamos utilizar é o MySQL.
Devemos obrigatoriamente seguir os passos:
Para acessar um banco de dados, primeiro precisamos ter acesso à um banco de dados.
Nesta aula usaremos, como exemplo o mysql com um banco de dados chamado veterinario22 com somente uma tabela chamada Gatos apenas com um id e um nome:
mysql> describe Gatos;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| nome | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0,00 sec)
O Driver é um arquivo .jar distribuídos pela própria empresa do banco de dados.
Para encontrar o driver do mysql basta procurar por "jdbc mysql driver", e escolher a "distribuição independente da plataforma".
Depois de baixar o driver, você deve incluir o .jar em seu projeto como uma biblioteca externa.
No Eclipse, por exemplo, clique com o botão da direita no projeto > properties > java build path > Libraries > classpath > add external jar; escolha o arquivo baixado.
Para fazer a conexão usaremos a interface Connection de java.sql.Connection. Criaremos um objeto filho de Connection através do método estático DriverManager do java.sql.DriverManager:
static private String USER = "user"; static private String PASS = "123456"; static private String DATABASE = "veterinario22"; static private String URL = "jdbc:mysql://localhost:3306/" + DATABASE; static void testaConnection() { try (Connection c = DriverManager.getConnection(URL, USER, PASS)){ System.out.println("Conexao estabelecida"); }catch(Exception e) { e.printStackTrace(); } }
onde
USER é o usuárioPASS é o password do banco de dadosDATABASE é o banco de dados que será usadoURL é o endereço do banco de dados, no caso o banco de dados está instalado em meu computador, então o endereço, por padrão, será "jdbc:mysql://localhost:3306/", concatenado com o nome do banco de dados.Para atualizar o banco de dados vamos usar o PreparedStatement e adicionar um Gato no banco de dados:
@Override public void addGato(Gato gato) { final String query = "INSERT INTO Gatos VALUES (?, ?)"; try (Connection c = DriverManager.getConnection(URL, USER, PASS)){ PreparedStatement pstm = c.prepareStatement(query); pstm.setInt(1, gato.getId()); pstm.setString(2, gato.getNome()); int result = pstm.executeUpdate(); System.out.println("Resultado de adicionar gato " + gato + ": " + result); }catch(Exception e) { e.printStackTrace(); } }
Os passos funcionam assim:
Gato de entrada, lembrando que Gato tem os campos id (int) e nome (String).? onde queremos inserir as palavras de entrada: "INSERT INTO Gatos VALUES (?, ?)"PreparedStatement à partir da conexão. Este objeto recebe como parâmetro o comando para inserir uma entrada no banco de dados.? que deixamos no comando, pedimos para o PreparedStatement fazer isso: com pstm.setInt(1, gato.getId()) pedimos para colocar um int no primeiro ? e o valor deste inteiro será gato.getId(); com pstm.setString(2, gato.getNome()); pedimos para inserir uma String no segundo ? e o valor desta String será gato.getNome().PreparedStatement executar a atualização programada com pstm.executeUpdate();.Para fazer uma busca em um banco de dados precisamos usar o ResultSet para acessar o resultado da busca. No exemplo à seguir vamos fazer recuperar todos os gatos na tabela.
@Override public List<Gato> getTodosGatos() { List<Gato> gatos = new ArrayList<>(); final String query = "SELECT * FROM Gatos;"; try (Connection c = DriverManager.getConnection(URL, USER, PASS)){ Statement stm = c.createStatement(); ResultSet rs = stm.executeQuery(query); while(rs.next()) { int id = rs.getInt("id"); String nome = rs.getString("nome"); Gato gato = new Gato(id, nome); gatos.add(gato); } }catch(Exception e) { e.printStackTrace(); } return gatos; }
Os passos funcionam assim:
"SELECT * FROM Gatos;" (desta vez não precisamos colocar o ?)Statement à partir da conexão. Este objeto fará a busca. Perceba que não precisamos criar um PreparedStatement, pois não temos o caracter especial ?.Statement realizar a busca e criamos um ResultSet para receber o resultado da busca.ResultSet precisamos usar o método next(), este método fará o ponteiro do ResultSet ir para a próxima entrada do resultado, retornando true enquanto tiver uma próxima entrada.ResultSet podemos pegar o valor desta entrada pelo nome da coluna, especificando qual é o tipo de dado que irá retorna: rs.getInt("id"); pede para pegar a coluna id como um inteiro; rs.getString("nome"); pede para pegar a coluna nome como uma String.Usando estes componentes podemos fazer qualquer comando simples em um banco de dados. Só lembre que:
PreparedStatementStatementexecuteQuery e receber um ResultSetexecuteUpdateRaramente iremos precisar fazer uma atualização ou uma busca usando argumentos pré-programados.
Normalmente é o usuário final quem deve fornecer os argumentos para usar na nossa busca ou atualização.
Neste caso nunca devemos concatenar uma String de um comando com uma String fornecida pelo usuário.
Sob o risco do sistema sofrer um injection atack.
O recomendável para esta situação é usar a classe PreparedStatement
.