Operações CRUD
Operações Básicas para um Banco de Dados
No capítulo anterior, você completou uma tarefa bastante complexa e interessante sobre gestão de bibliotecas. Implementou métodos para adicionar, recuperar e remover elementos da lista lá presente. Sabia que tais operações são essenciais para todas as listas e aplicações? Essas operações são conhecidas como operações CRUD!
CRUD é a sigla para CRIAR, LER, ATUALIZAR e DELETAR, representando uma lista de operações a serem realizadas em um banco de dados. No nosso caso, na tarefa anterior, a classe Library
serviu como nosso banco de dados, especificamente a lista de livros. Escrevemos operações fundamentais para trabalhar com esta lista, personalizando cada uma delas de forma leve. Criamos métodos mais focados para recuperar um livro por autor ou obter uma lista de livros publicados após um ano específico.
Operações similares são empregadas em grandes aplicações para interagir com bancos de dados. No final, nossa aplicação deve:
- Ser capaz de criar dados no banco de dados.
- Ser capaz de ler dados do banco de dados.
- Ser capaz de atualizar dados específicos no banco de dados.
- Ser capaz de deletar dados do banco de dados.
Nota
Observe que, no nosso caso, o banco de dados é representado por uma estrutura de dados, uma lista, que atualmente serve como nossa solução alternativa. No futuro, em vez de uma lista simples, usaremos um banco de dados.
Você deve ter notado que não implementamos o método update na tarefa anterior.
Vamos fazer isso agora:
Primeiro precisamos recuperar o livro pelo ID para atualizar um elemento pelo ID. Para isso, vamos implementar um método que busca o livro pelo ID. É melhor fazer desta maneira do que implementar a lógica de obter um livro pelo seu ID no método de atualização do livro, pois podemos reutilizar este método em outras funções, tornando-o mais versátil.
Library.java
123456789public Book findBookById(int id) { Book result; for (Book book : books) { if (book.getId() == id){ result = book; } } return result; }
A solução acima é uma boa opção, mas existe um pequeno problema. Receberemos um erro se tal ID não existir na nossa lista. Precisamos tratar esse erro e exibir uma mensagem na tela indicando que não há tal livro na lista (base de dados).
Library.java
123456789101112public Book findBookById(int id) { Book result = null; for (Book book : books) { if (book.getId() == id){ result = book; } } if (result == null) { result = new Book("Unknown", "Unknown", 0); } return result; }
Inicialmente, inicializamos a variável result
como null nesta solução. Após implementar a pesquisa de livro por ID, realizamos uma verificação para ver se o nosso resultado ainda está null. Se for true
, criamos um novo livro indefinido.
Vamos passar à implementação do método de atualização:
Library.java
123456789101112public void updateBookById(int id, Book newBook) { Book bookToBeUpdated = findBookById(id); for (Book book : books) { if (book.getId().equals(bookToBeUpdated.getId())) { book.setId(newBook.getId()); book.setAuthor(newBook.getAuthor()); book.setTitle(newBook.getTitle()); book.setYear(newBook.getYear()); return; // ending loop execution, because update operation has executed successfully } } }
Ótimo! Atualizamos o livro atualizando todos os seus parâmetros. Eu recomendo fortemente fazer dessa maneira, porque se simplesmente reatribuirmos o livro, erros inesperados podem ocorrer. Assim, atualizamos o livro pelo ID, reatribuindo-o aos parâmetros do novo livro. Agora, vamos usar o método de atualização e ver o que acontece:
main.java
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148package com.example; import java.util.ArrayList; import java.util.List; class Main { public static void main(String[] args) { Library library = new Library(); library.addBook(new Book("Java: The Complete Reference", "Herbert Schildt", 2019)); library.addBook(new Book("Effective Java", "Joshua Bloch", 2020)); library.addBook(new Book("Clean Code", "Robert C. Martin", 2008)); System.out.println("All books in the library:"); library.displayAllBooks(); Book newBook = new Book("Head First Java", "Katy Siera", 2022); library.updateBookById(2, newBook); System.out.println("\nAll books after using update method"); library.displayAllBooks(); } } class Book { private static Long nextId = 1L; private String title; private String author; private int year; private Long id; public Book(String title, String author, int year) { this.title = title; this.author = author; this.year = year; this.id = nextId++; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Override public String toString() { return "Book{" + "title='" + title + '\'' + ", author='" + author + '\'' + ", year=" + year + ", id=" + id + '}'; } } class Library { public List<Book> books = new ArrayList<>(); public void addBook(Book book) { books.add(book); } public void removeBookById(int id) { List<Book> booksToRemove = new ArrayList<>(); for (Book book : books) { if (book.getId() == id) { booksToRemove.add(book); } } books.removeAll(booksToRemove); } public List<Book> findBooksByAuthor(String author) { List<Book> booksWithSpecifiedAuthor = new ArrayList<>(); for (Book book : books) { if (book.getAuthor().equals(author)) { booksWithSpecifiedAuthor.add(book); } } return booksWithSpecifiedAuthor; } public List<Book> findBooksPublishedAfterYear(int year) { List<Book> booksPublishedAfterYear = new ArrayList<>(); for (Book book : books) { if (book.getYear() > year){ booksPublishedAfterYear.add(book); } } return booksPublishedAfterYear; } public Book findBookById(int id) { Book result = null; for (Book book : books) { if (book.getId() == id){ result = book; } } if (result == null) { result = new Book("Unknown", "Unknown", 0); } return result; } public void updateBookById(int id, Book newBook) { Book bookToBeUpdated = findBookById(id); for (Book book : books) { if (book.getId().equals(bookToBeUpdated.getId())) { book.setId(newBook.getId()); book.setAuthor(newBook.getAuthor()); book.setTitle(newBook.getTitle()); book.setYear(newBook.getYear()); return; // ending loop execution, because update operation has executed successfully } } } public void displayAllBooks() { System.out.println(books); } }
Agora, a classe Library
possui todas as operações CRUD.
Você fez um ótimo trabalho se entendeu tudo isso. Recomendo que copie os métodos que mostrei neste capítulo e os adicione ao seu código do trabalho anterior, pois este código atualizado será útil mais tarde.
1. O que significa o acrônimo CRUD?
2. Por que é necessário implementar operações CRUD no seu código?
3. As operações CRUD podem ser usadas com bancos de dados?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Can you explain more about how to implement the update method?
What should I do if the book ID does not exist in the list?
Can you show an example of how to use the update method in practice?
Awesome!
Completion rate improved to 4
Operações CRUD
Deslize para mostrar o menu
Operações Básicas para um Banco de Dados
No capítulo anterior, você completou uma tarefa bastante complexa e interessante sobre gestão de bibliotecas. Implementou métodos para adicionar, recuperar e remover elementos da lista lá presente. Sabia que tais operações são essenciais para todas as listas e aplicações? Essas operações são conhecidas como operações CRUD!
CRUD é a sigla para CRIAR, LER, ATUALIZAR e DELETAR, representando uma lista de operações a serem realizadas em um banco de dados. No nosso caso, na tarefa anterior, a classe Library
serviu como nosso banco de dados, especificamente a lista de livros. Escrevemos operações fundamentais para trabalhar com esta lista, personalizando cada uma delas de forma leve. Criamos métodos mais focados para recuperar um livro por autor ou obter uma lista de livros publicados após um ano específico.
Operações similares são empregadas em grandes aplicações para interagir com bancos de dados. No final, nossa aplicação deve:
- Ser capaz de criar dados no banco de dados.
- Ser capaz de ler dados do banco de dados.
- Ser capaz de atualizar dados específicos no banco de dados.
- Ser capaz de deletar dados do banco de dados.
Nota
Observe que, no nosso caso, o banco de dados é representado por uma estrutura de dados, uma lista, que atualmente serve como nossa solução alternativa. No futuro, em vez de uma lista simples, usaremos um banco de dados.
Você deve ter notado que não implementamos o método update na tarefa anterior.
Vamos fazer isso agora:
Primeiro precisamos recuperar o livro pelo ID para atualizar um elemento pelo ID. Para isso, vamos implementar um método que busca o livro pelo ID. É melhor fazer desta maneira do que implementar a lógica de obter um livro pelo seu ID no método de atualização do livro, pois podemos reutilizar este método em outras funções, tornando-o mais versátil.
Library.java
123456789public Book findBookById(int id) { Book result; for (Book book : books) { if (book.getId() == id){ result = book; } } return result; }
A solução acima é uma boa opção, mas existe um pequeno problema. Receberemos um erro se tal ID não existir na nossa lista. Precisamos tratar esse erro e exibir uma mensagem na tela indicando que não há tal livro na lista (base de dados).
Library.java
123456789101112public Book findBookById(int id) { Book result = null; for (Book book : books) { if (book.getId() == id){ result = book; } } if (result == null) { result = new Book("Unknown", "Unknown", 0); } return result; }
Inicialmente, inicializamos a variável result
como null nesta solução. Após implementar a pesquisa de livro por ID, realizamos uma verificação para ver se o nosso resultado ainda está null. Se for true
, criamos um novo livro indefinido.
Vamos passar à implementação do método de atualização:
Library.java
123456789101112public void updateBookById(int id, Book newBook) { Book bookToBeUpdated = findBookById(id); for (Book book : books) { if (book.getId().equals(bookToBeUpdated.getId())) { book.setId(newBook.getId()); book.setAuthor(newBook.getAuthor()); book.setTitle(newBook.getTitle()); book.setYear(newBook.getYear()); return; // ending loop execution, because update operation has executed successfully } } }
Ótimo! Atualizamos o livro atualizando todos os seus parâmetros. Eu recomendo fortemente fazer dessa maneira, porque se simplesmente reatribuirmos o livro, erros inesperados podem ocorrer. Assim, atualizamos o livro pelo ID, reatribuindo-o aos parâmetros do novo livro. Agora, vamos usar o método de atualização e ver o que acontece:
main.java
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148package com.example; import java.util.ArrayList; import java.util.List; class Main { public static void main(String[] args) { Library library = new Library(); library.addBook(new Book("Java: The Complete Reference", "Herbert Schildt", 2019)); library.addBook(new Book("Effective Java", "Joshua Bloch", 2020)); library.addBook(new Book("Clean Code", "Robert C. Martin", 2008)); System.out.println("All books in the library:"); library.displayAllBooks(); Book newBook = new Book("Head First Java", "Katy Siera", 2022); library.updateBookById(2, newBook); System.out.println("\nAll books after using update method"); library.displayAllBooks(); } } class Book { private static Long nextId = 1L; private String title; private String author; private int year; private Long id; public Book(String title, String author, int year) { this.title = title; this.author = author; this.year = year; this.id = nextId++; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Override public String toString() { return "Book{" + "title='" + title + '\'' + ", author='" + author + '\'' + ", year=" + year + ", id=" + id + '}'; } } class Library { public List<Book> books = new ArrayList<>(); public void addBook(Book book) { books.add(book); } public void removeBookById(int id) { List<Book> booksToRemove = new ArrayList<>(); for (Book book : books) { if (book.getId() == id) { booksToRemove.add(book); } } books.removeAll(booksToRemove); } public List<Book> findBooksByAuthor(String author) { List<Book> booksWithSpecifiedAuthor = new ArrayList<>(); for (Book book : books) { if (book.getAuthor().equals(author)) { booksWithSpecifiedAuthor.add(book); } } return booksWithSpecifiedAuthor; } public List<Book> findBooksPublishedAfterYear(int year) { List<Book> booksPublishedAfterYear = new ArrayList<>(); for (Book book : books) { if (book.getYear() > year){ booksPublishedAfterYear.add(book); } } return booksPublishedAfterYear; } public Book findBookById(int id) { Book result = null; for (Book book : books) { if (book.getId() == id){ result = book; } } if (result == null) { result = new Book("Unknown", "Unknown", 0); } return result; } public void updateBookById(int id, Book newBook) { Book bookToBeUpdated = findBookById(id); for (Book book : books) { if (book.getId().equals(bookToBeUpdated.getId())) { book.setId(newBook.getId()); book.setAuthor(newBook.getAuthor()); book.setTitle(newBook.getTitle()); book.setYear(newBook.getYear()); return; // ending loop execution, because update operation has executed successfully } } } public void displayAllBooks() { System.out.println(books); } }
Agora, a classe Library
possui todas as operações CRUD.
Você fez um ótimo trabalho se entendeu tudo isso. Recomendo que copie os métodos que mostrei neste capítulo e os adicione ao seu código do trabalho anterior, pois este código atualizado será útil mais tarde.
1. O que significa o acrônimo CRUD?
2. Por que é necessário implementar operações CRUD no seu código?
3. As operações CRUD podem ser usadas com bancos de dados?
Obrigado pelo seu feedback!