Hoje aprenderemos a criar o insert no banco de dados a partir do sistema. Já o fizemos no tutorial anterior inserindo-o diretamente no banco por meio de SQL puro, quando testávamos o banco. Agora é hora de prepararmos o sistema para inserir os dados.
No tutorial anterior criamos a tabela “userposjava”, dentro da tabela definimos os campos do identificador ID, nome e e-mail. E ainda aprendemos como visualizar em um primeiro momento toda a tabela. Esta não seria uma prática recomendada em uma tabela com milhares de campos, porém, sabemos que nossa base de dados conta com poucos registros.
CRIANDO O INSERT
Criaremos o insert utilizando Java, SQL e o JDBC. Na classe UserPosDAO, criaremos o método “salvar” que receberá o objeto da UserposJava com os dados.
public void salvar (UserposJava userposjava){
}
No escopo do método “salvar”, envolvido em um bloco try o primeiro passo será a implementação da instrução SQL para inserir os dados na tabela. Tal como fizemos diretamente no banco. Quando formos atribuir os parâmetros do values, colocaremos pontos de interrogação, visto que estes valores serão resgatados do objeto.
try{
String sql = "insert into userposjava(id, nome, email) values(?,?,?)";
}
E na sequência instanciaremos o objeto PreparedStatement cuja responsabilidade é fazer o select, ou seja, a busca dos dados. Que receberá o objeto connection com a instrução prepareStatement que recebe o sql que instanciamos na linha de código acima.
try{
String sql = "insert into userposjava(id, nome, email) values (?,?,?)";
PreparedStatement insert = connection.prepareStatement(sql);
}
Recapitulando, temos então o objeto PreparedStatement que é retornado de dentro de uma conexão passando o sql. O próximo passo é passar os dados, “setando-os” por meio do insert.
INSERINDO OS DADOS
Em um primeiro momento a inserção dos dados será de forma fixa. É importante, considerar a ordem dos dados no momento de informar os valores, assim, id, nome e e-mail, são respectivamente 1, 2, 3. Dessa forma, o primeiro parâmetro da instrução é a posição que ele ocupa. Vejamos, para informarmos o ID, passamos o 1, por ser o primeiro dado a ser informado e por conseguinte o valor correspondente ao seu lugar na tabela.
insert.setLong(1, 3);
insert.setString(2, "Alex Egídio");
insert.setString(3, "alex.egidio@gmail.com");
Após definir os valores a serem inseridos, colocaremos os dados dentro do banco “pedindo” ao insert que execute, fazemos por meio da linha de código.
insert.execute();
O que fizemos, foi pegar o sql, prepará-lo, e passar os parâmetros de id, nome e e-mail, obedecendo rigorosamente a ordem de inserção. E por fim, salvamos os dados, pegando o objeto connection e “declarando” um commit.
Conncection.commit();
Fazer um commit é o ato de enviar, salvar, ou seja, fazer um upload dos códigos para um banco de dados. Em SQL uma declaração commit finaliza uma transação dentro de um SGBD – Sistema de Gerenciamento de Banco de Dados.
CLASSE DE TESTE
Calma, que ainda temos mais passos para serem implementados, na classe TesteBancoJdbc, delete o “SingleConnection.getConnection();”, não precisamos mais dele.
Agora instanciaremos o objeto do UserPosDAO, já que o DAO implementa a conexão. E também o objeto de modelo.
UserPosDAO userPosDao = new UserPosDAO();
Userposjava userposjava = new Userposjava();
Objetivando garantir ou melhor, evitar um erro de conexão, vamos chamar o UserPosDAO e passar como parâmetro o userposjava.
userPosDao.salvar(userposjava);
Selecione a assinatura do método e clique com o botão direito sobre a classe de teste e dê um Run As >> JUnit Test e veja no banco de dados o resultado da implementação que acabamos de fazer.
Se tentarmos executar uma segunda vez, a mensagem “ERROR: duplicate key value violates unique constraint “user_pk” Detalhe: Key (id)=(3) already exists” será exibida. Isto ocorre porque em nossa base de dados o ID 3 já existe.
Altere o ID execute novamente volte ao banco de dados atualize (F5) a tabela e veja o resultado. Entretanto, estamos adicionando os dados na tabela de forma estática, como fazer isso de forma “automática”.
Ainda na classe TesteBancoJDBC vamos passar o objeto que será recuperado por parâmetro, por meio do salvar.
userposjava.setId(5L);
userposjava.setNome("Alan Egídio");
userposjava.setEmail("alan.egidio@gmail.com");
Na classe userposDAO recuperaremos os dados por meio do método get, assim eles serão passados para o insert.
insert.setLong(1, userposjava.getId());
insert.setString(2, userposjava.getNome());
insert.setString(3, userposjava.getEmail());
TRATAMENTO DE ERROS E EXCEÇÕES
Toda a estrutura do DAO foi implementada dentro de um bloco try, entretanto, precisamos tratar os erros e exceções. Assim, abra um novo try/catch dentro do bloco catch, e implemente o rollback.
O comando ROLLBACK é utilizado para desistir das alterações no banco de dados que foram feitas dentro da unidade de trabalho ou do ponto de salvamento.
Catch (Exception e){
try{
Connection.rollback();
} catch(SQLException e1){
e1.printStackTrace();
}
e.printStackTrace();
}
EM POUCAS PALAVRAS
Então implementamos um DAO fazendo o insert, e a classe TesteBancoJDBC executando, criando um DAO dentro do qual já existe uma conexão. “Setamos” os dados e o passamos por meio do método salvar ao insert. Assim o método salvar prepara a conexão, recupera de dentro do objeto userposjava os dados por meio do get passando-os para as suas respectivas posições, executa e declara um commit.