Olá, estudante! Agora que você já aprendeu a utilizar exceções em Java para tratamento de erros, chegou a hora de trabalhar com manipulação de dados. Nesta lição, exploraremos os fundamentos da manipulação de dados em Java, em conjunto com o sistema gerenciador de banco de dados MySQL. O objetivo é capacitar você, futuro(a) Técnico(a) em Desenvolvimento de Sistemas, a compreender e aplicar os conceitos essenciais para realizar operações de conexão, consulta básica, inserção, atualização e exclusão de dados.
No decorrer desta lição, você compreenderá melhor o entendimento dos princípios básicos da conexão com um banco de dados MySQL em uma aplicação Java. Você também descobrirá como executar consultas SQL e o tratamento de seus resultados, também em Java. Desenvolver habilidades para realizar operações de manipulação de dados, como inserção, atualização e exclusão, bem como adquirirá conhecimento sobre o gerenciamento de transações e sua importância na integridade dos dados.
Assim, ao final desta lição, você estará apto(a) a construir aplicativos Java capazes de interagir, de forma eficaz, com bancos de dados MySQL, permitindo a manipulação tão segura quanto eficiente de dados em suas aplicações. Preparado(a) para a lição de hoje?
Considere que uma empresa de comércio eletrônico deseja desenvolver um sistema robusto para gerenciar seu estoque, processar pedidos de clientes e fornecer relatórios de vendas. Enquanto desenvolvedor(a), você consegue imaginar qual seria um dos principais problemas ao desenvolver esse sistema?
Se estamos considerando uma empresa, um dos principais problemas que podem surgir nesse contexto é a necessidade de manipular grandes volumes de dados, de forma eficiente e segura. Ao lidar com um grande número de produtos, transações de vendas e informações de clientes, é essencial ter um sistema capaz de se integrar facilmente a um banco de dados e realizar operações como consulta, inserção, atualização e exclusão de dados. A manipulação de dados em Java oferece uma solução para esse problema, permitindo que você, Técnico(a) em Desenvolvimento de Sistemas, crie aplicativos robustos e escaláveis ao back-end.
Usando Java em conjunto com um banco de dados relacional, como o MySQL, por exemplo, você pode estabelecer conexões seguras com o banco de dados, executar consultas SQL complexas para recuperar dados específicos, inserir novos registros nesse banco, atualizar informações existentes e excluir dados obsoletos. Portanto, ao enfrentar o problema de manipular grandes volumes de dados em um ambiente de back-end, a utilização de Java apresenta-se enquanto uma solução eficaz e confiável, visto que permite a empresa desenvolver um sistema back-end robusto, escalável, capaz de lidar, de forma eficiente e segura, com as demandas do comércio eletrônico.
O case hipotético da lição de hoje é sobre a empresa Logi Tech, a qual enfrentava desafios significativos no gerenciamento de suas operações de transporte e armazenamento de mercadorias. Com um volume substancial de pedidos, informações de rastreamento de cargas e registros de inventário, a empresa precisava de uma solução eficiente para gerenciar e processar todos esses dados em seu sistema back-end. Diante desse problema, a Logi Tech decidiu desenvolver um software de gerenciamento logístico personalizado para atender às suas necessidades específicas. A equipe de desenvolvimento optou por utilizar Java na manipulação de dados, combinando-o com um banco de dados relacional robusto, como o MySQL.
Ao longo do desenvolvimento do software, a equipe implementou uma variedade de recursos de manipulação de dados em Java para lidar com diferentes aspectos das operações da empresa, tais como: conexões seguras com o banco de dados, consultas SQL avançadas, transações seguras, inserção e atualização de dados. Graças à utilização eficaz da manipulação de dados em Java, a empresa foi capaz de desenvolver um software back-end altamente funcional e escalável que gerenciasse suas operações logísticas. Dessa forma, o novo sistema permitiu a Logi Tech otimizar seus processos, reduzir erros e oferecer um serviço tão eficiente quanto confiável aos clientes.
Portanto, o case hipotético apresentado hoje ilustra, de forma clara, como a manipulação de dados em MySQL está integrada ao desenvolvimento de sistemas, especialmente quando se trata de criar soluções personalizadas. Observe que o Técnico em Desenvolvimento de Sistemas desempenha um papel essencial, aplicando conhecimentos técnicos para implementar soluções eficazes que melhorem a eficiência operacional e a qualidade dos serviços prestados pela empresa aos seus clientes. Sabendo disso, vamos aprender mais sobre esse assunto?
A conexão entre uma aplicação Java e um banco de dados MySQL serve para permitir que a aplicação Java armazene, recupere, atualize e gerencie dados armazenados no banco de dados MySQL. Em termos gerais, essa conexão possibilita que a aplicação interaja de forma dinâmica e eficiente com os dados persistentes armazenados no banco de dados relacional. Sendo assim, a conexão entre uma aplicação Java e um banco de dados MySQL é essencial para muitos aplicativos que precisam armazenar e recuperar dados de forma eficiente. Este processo de conexão envolve algumas etapas importantes, e a seguir veremos cada uma delas:
O primeiro passo é garantir que você tenha o driver JDBC correto para o MySQL. De acordo com Deitel e Deitel (2016), o JDBC suporta a descoberta automática de driver, carregando o driver de banco de dados na memória conforme necessário. Você precisa baixar e adicionar o driver JDBC MySQL ao seu projeto Java. Em um projeto nessa linguagem, é necessário, para pleno funcionamento, instalar a biblioteca do driver utilizado.
Você precisa especificar o URL de conexão para se conectar ao seu banco de dados MySQL. Essa tarefa, geralmente, inclui o endereço do servidor MySQL, o número da porta, o nome do banco de dados e outras informações de autenticação, como nome de usuário e senha.
Em seguida, você deve usar a classe java.sql.Connection para estabelecer uma conexão com o banco de dados MySQL. Você pode fazer isso utilizando o método DriverManager.getConnection(url, username, password) e armazenando a conexão em uma variável. Segundo Deitel e Deitel (2016), a classe Connection permite aos programas criar instruções SQL que acessam banco de dados.
Com a conexão estabelecida, você pode criar e executar consultas SQL para interagir com o banco de dados MySQL. Essa ação inclui consultas de seleção para recuperar dados, consultas de atualização voltado a modificar dados e consultas de inserção para adicionar novos registros ao banco de dados.
Durante o processo de conexão e execução de consultas, é importante lidar com possíveis exceções. Por exemplo, podem ocorrer erros de conexão se o URL estiver incorreto ou se as credenciais de autenticação estiverem erradas. Portanto, é essencial capturar e tratar essas exceções adequadamente, para garantir que sua aplicação seja robusta e resiliente.
Por fim, após concluir todas as operações do banco de dados, feche a conexão com o banco de dados MySQL para liberar recursos. Isso é feito chamando o método connection.close().
Vamos analisar um exemplo de conexão com MySQL e Java? Acompanhe na Figura 1:
Agora, analisaremos linha a linha da Figura 1:
Linha 1: importa todas as classes do pacote java.sql, que contém as classes necessárias para trabalhar com JDBC (Java Database Connectivity).
Linha 3: aqui é declarada a classe BancoDeDadosMaven, que contém o método main como ponto de entrada do programa.
Linha 5: declaração do método main, que é o ponto de entrada do programa Java.
Linha 6: define a URL de conexão com o banco de dados MySQL, onde jdbc:mysql://localhost:3306/coblue_review_1083 indica o endereço do banco de dados, neste caso, localmente.
Linha 7: define o nome de usuário do banco de dados.
Linha 8: define a senha do banco de dados.
Linha 10: declaração de uma variável connection do tipo Connection e inicialização com null.
Linha 11: declaração de uma variável statement do tipo Statement e inicialização com null.
Linha 12: declaração de uma variável resultSet do tipo ResultSet e inicialização com null.
Linha 14 a 31: bloco try-catch, onde o código dentro do bloco try é executado e exceções do tipo SQLException são tratadas no bloco catch.
Linha 15: estabelece uma conexão com o banco de dados usando a URL, nome de usuário e senha fornecidos.
Linha 16: cria um objeto Statement associado à conexão estabelecida.
Linha 18: define uma consulta SQL para selecionar todos os registros da tabela users.
Linha 19: executa a consulta SQL e armazena o resultado em um objeto ResultSet.
Linha 21 a 27: itera sobre os resultados do ResultSet, avançando para o próximo registro enquanto houver registros disponíveis.
Linha 22: obtém o valor do campo “id” do registro atual do ResultSet como um inteiro.
Linha 23: obtém o valor do campo “name” do registro atual do ResultSet como uma string.
Linha 24: obtém o valor do campo “email” do registro atual do ResultSet como uma string.
Linha 26: exibe na saída padrão os valores dos campos “id”, “name” e “email” do registro atual do ResultSet.
Linha 30: imprime a pilha de rastreamento da exceção, caso ocorra uma exceção do tipo SQLException.
A execução de consultas SQL usando Java e MySQL segue um processo estruturado que inclui várias etapas essenciais. Primeiramente, uma conexão com o banco de dados é estabelecida usando a classe DriveManager e o método getConnection(), pelo fornecimento da URL de conexão, do nome de usuário e da senha. Em seguida, uma declaração SQL é criada usando a conexão estabelecida, através do método createStatement() da classe Connection.
A consulta SQL então é executada usando o método apropriado da declaração, como executeQuery() para consultas de seleção, ou executeUpdate() para consultas de modificação. Se a consulta for uma operação de seleção, os resultados são retornados como um objeto ResultSet, o qual pode ser iterado para recuperar os dados desejados. Após a conclusão das operações no banco de dados, a conexão deve ser fechada para liberar os recursos do sistema, pela utilização dos métodos close() nas instâncias de ResultSet, Statement e Connection.
A Figura 1, apresentada no tópico anterior, ilustra a conexão com o banco de dados, mas também a operação de consulta SQL sendo realizada via Java e MySql.
A rotina para inserção, atualização e exclusão de dados é a mesma para consulta, tendo como principal diferença o uso do comando executeUpdate() no lugar no comando executeQuery(), como você pode conferir na Figura 2 (foram omitidos os códigos que já são usados para conexão e try-catch, apresentados, também, na Figura 1):
Agora, analisaremos linha a linha da Figura 2, com exceção daquelas que já foram compreendidas:
Linha 9: define uma string contendo uma instrução SQL, para inserir um novo registro na tabela users.
Linha 10: cria um objeto Statement a partir da conexão com o banco de dados, para executar a instrução SQL de inserção.
Linha 11: executa a instrução SQL de inserção usando o método executeUpdate() do objeto Statement e armazena o número de linhas afetadas na variável rowsInserted.
Linha 12: imprime, na saída padrão, o número de linhas inseridas no banco de dados.
O mesmo processo é repetido para as operações de atualização e exclusão de dados, substituindo as consultas SQL e as mensagens de saída apropriadas.
O bloco try-catch (SQLException e) trata quaisquer exceções que possam ocorrer durante a execução das operações de banco de dados, imprimindo os detalhes do erro na saída padrão. Esse bloco pode ser conferido também na Figura 1, ou pelo comando Try (Connection connection = DriverManager.getConnection(url, username, email)) { e catch (SQLException e) { e.printStackTrace(); }.
Em resumo, esse código conecta-se a um banco de dados MySQL através das variáveis url, username e email, insere um novo registro na tabela users, atualiza um registro existente e exclui um registro bem como imprime o número de linhas afetadas para cada operação.
Para manipular e processar os resultados das consultas SQL em Java, usamos a classe ResultSet, que representa um conjunto de resultados de uma consulta SQL. Teremos, agora, uma visão geral de como isso é feito:
Execução da consulta SQL: primeiro, você precisa executar uma consulta SQL usando o objeto Statement ou PreparedStatement como: Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(“SELECT * from users”);
Interação sobre os resultados: em seguida, você pode iterar sobre os resultados usando métodos como next(), para mover até o próximo registro, e métodos como getInt(), getString(), etc., para obter os valores das colunas, como realizado na Figura 3.
Dentro do loop, você pode acessar os dados conforme necessário. Por exemplo, é possível armazená-los em objetos Java, exibi-los na saída padrão, ou passá-los para outras partes do seu programa com fins de processamento adicional. Após concluir o processamento dos resultados, é importante liberar os recursos associados ao ResultSet e ao Statement, o que, geralmente, é feito no bloco finally (try...catch…finally), com intuito de garantir que os recursos sejam liberados, independentemente de ocorrerem exceções ou não. Para isso, você só precisa dos métodos resultSet.close() e statement.close().
O conceito de transações é fundamental no contexto de manipulação de dados, especialmente em bancos de dados relacionais, onde a integridade e a consistência são fundamentais. No caso de um sistema bancário, ao transferir o dinheiro eletronicamente entre contas bancárias, é essencial garantir que a operação seja concluída com sucesso e, claro, de forma segura (Deitel; Deitel, 2016).
Mas, o que, de fato, é uma transação?
A transação é uma unidade lógica de trabalho que engloba uma ou mais operações de banco de dados, como inserção, atualização ou exclusão de registros. O objetivo de uma transação é garantir que todas as operações sejam executadas com sucesso, ou que nenhuma seja executada se ocorrer um erro em qualquer uma delas. No geral, as transações devem garantir quatro propriedades fundamentais, conhecidas como ACID (Atomicidade-Consistência-Isolamento-Durabilidade):
Atomicidade (Atomicity): todas as operações em uma transação devem ser realizadas com sucesso ou nenhuma delas deve ser realizada. Não pode haver estado intermediário, onde apenas algumas operações foram aplicadas.
Consistência (Consistency): após a conclusão de uma transação, o banco de dados deve permanecer em um estado consistente, ou seja, todas as restrições e regras de integridade precisam ser mantidas.
Isolamento (Isolation): as operações de uma transação devem ser isoladas umas das outras, de modo que o resultado de uma transação não seja afetado por outras transações concorrentes em execução simultânea.
Durabilidade (Durability): uma vez que uma transação é confirmada (commit), suas alterações precisam ser permanentemente registradas no banco de dados, mesmo em caso de falha do sistema.
Em Java, as transações são, de modo geral, gerenciadas por meio de objetos Connection. Você pode agrupar várias operações SQL em uma transação e controlar o commit ou rollback explicitamente. O uso de blocos try-catch-finally é comum para garantir a consistência e a integridade dos dados durante as transações.
Agora que aprendeu a conectar um banco de dados MySQL utilizando a linguagem de programação Java, você é capaz de aplicar os conhecimentos de SQL adquiridos na disciplina de Banco de Dados para testar a implementação de consultas mais complexas. Que tal? Acredito que será uma experiência de aprendizado muito enriquecedora!
Trabalhar com banco de dados em desenvolvimento de sistemas é de extrema importância para garantir a eficácia, a segurança e a integridade dos dados manipulados pelas aplicações. Ao compreender os princípios fundamentais da manipulação de dados em Java, em conjunto com um sistema gerenciador de banco de dados, como o MySQL, você, futuro(a) Técnico em Desenvolvimento de Sistemas, adquiriu as habilidades necessárias para realizar uma série de operações essenciais, desde o estabelecimento da conexão com o banco de dados até a execução de consultas SQL e o processamento dos resultados obtidos, por meio da interação eficiente com os dados armazenados.
Para praticar as conexões e, também, as operações com banco de dados, o desafio de hoje será seguir esses passos necessários na criação da sua classe de conexão com qualquer banco MySQL. Você também poderá interagir com ele através da linguagem de programação Java:
Primeiro, crie um novo projeto Java em sua IDE preferida e implemente a seguinte classe de conexão da Figura 4:
Para que essa classe funcione, será necessário a criação do banco de dados, assim, você conseguirá inclusive preencher as variáveis das linhas 7, 8 e 9 da Figura 4.
Primeiro, instale o SGBD MySQL em sua máquina ou no laboratório (caso ainda não tenha). Se precisar de um tutorial para instalação, clique aqui. Agora, a criação do banco de dados em si dependerá do propósito do seu projeto: tabelas, relações etc. Lembre-se: a classe de conexão da Figura 4 é genérica, portanto, independentemente do propósito do seu projeto, ela se conectará com seu SGBD instalado, basta que você altere o nome do banco (linha 7 da Figura 4).
Chame seus colegas e professores, crie o banco de dados e, com base nos conhecimentos adquiridos nesta lição, implemente um CRUD (Crie, Consulte, Atualize e Apague) simples na instância recém-criada no banco de dados. Bom trabalho!
DEITEL, P.; DEITEL H. Java: Como programar. 10. ed. São Paulo: Pearson, 2016.