Operaciones CRUD
Operaciones básicas de una base de datos
En el capítulo anterior, realizaste una tarea bastante compleja e interesante sobre gestión de bibliotecas. Allí implementaste métodos para añadir, recuperar y eliminar elementos de la lista. ¿Sabías que estas operaciones son esenciales para cualquier lista y aplicación? Estas operaciones se denominan operaciones CRUD.
CRUD son las siglas de CREATE, READ, UPDATE y DELETE, que representan una lista de operaciones a realizar sobre una base de datos. En nuestro caso, en la tarea anterior, la clase Library
sirvió como nuestra base de datos, específicamente la lista de libros. Escribimos las operaciones fundamentales para trabajar con esta lista, personalizando ligeramente cada una de ellas. Creamos métodos más específicos para recuperar un libro por autor u obtener una lista de libros publicados a partir de un año concreto.
Operaciones similares se emplean en grandes aplicaciones para interactuar con bases de datos. Al final, nuestra aplicación debería:
- Ser capaz de crear datos en la base de datos.
- Ser capaz de leer datos de la base de datos.
- Ser capaz de actualizar datos específicos en la base de datos.
-
- Ser capaz de borrar datos de la base de datos.
Nota
Observa que en nuestro caso, la base de datos está representada por una estructura de datos, una lista, que actualmente nos sirve como solución. En el futuro, en lugar de una simple lista, utilizaremos una base de datos.
Habrás notado que no implementamos el método actualizar en la tarea anterior.
Vamos a hacerlo ahora:
Primero necesitamos obtener el libro por ID** para actualizar un elemento por ID. Para ello, implementaremos un método que recupere el libro por ID. Es mejor hacerlo así que implementar la lógica de obtener un libro por su ID en el método de actualización del libro, ya que podemos reutilizar este método en otras funciones, haciéndolo más versátil.
Library.java
123456789public Book findBookById(int id) { Book result; for (Book book : books) { if (book.getId() == id){ result = book; } } return result; }
La solución anterior es una buena opción, pero hay un pequeño problema. Obtendremos un error si tal ID no existe en nuestra lista. Necesitamos manejar este error y mostrar un mensaje en pantalla indicando que no existe tal libro en la lista (base de datos).
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 la variable resultado
como nulo en esta solución. Después de implementar la búsqueda de libros por ID, realizamos una comprobación para ver si nuestro resultado sigue siendo nulo. Si es true
, creamos un nuevo libro indefinido.
Pasemos a implementar el método de actualización:
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 } } }
Estupendo. Actualizamos el libro actualizando todos sus parámetros. Recomiendo hacerlo de esta forma porque si simplemente reasignamos el libro, pueden producirse errores inesperados. De esta forma, actualizamos el libro por ID, reasignándolo a los parámetros del nuevo libro. Ahora, usemos el método update y veamos qué ocurre:
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); } }
Ahora, la clase Library
tiene todas las operaciones CRUD.
Has hecho un gran trabajo si has comprendido todo esto. Te recomiendo que copies los métodos que he mostrado en este capítulo y los añadas a tu código de la tarea anterior, ya que este código actualizado te será útil más adelante.
1. ¿Qué significa la sigla CRUD?
2. ¿Por qué es necesario implementar operaciones CRUD en tu código?
3. ¿Se pueden utilizar operaciones CRUD con bases de datos?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
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
Operaciones CRUD
Desliza para mostrar el menú
Operaciones básicas de una base de datos
En el capítulo anterior, realizaste una tarea bastante compleja e interesante sobre gestión de bibliotecas. Allí implementaste métodos para añadir, recuperar y eliminar elementos de la lista. ¿Sabías que estas operaciones son esenciales para cualquier lista y aplicación? Estas operaciones se denominan operaciones CRUD.
CRUD son las siglas de CREATE, READ, UPDATE y DELETE, que representan una lista de operaciones a realizar sobre una base de datos. En nuestro caso, en la tarea anterior, la clase Library
sirvió como nuestra base de datos, específicamente la lista de libros. Escribimos las operaciones fundamentales para trabajar con esta lista, personalizando ligeramente cada una de ellas. Creamos métodos más específicos para recuperar un libro por autor u obtener una lista de libros publicados a partir de un año concreto.
Operaciones similares se emplean en grandes aplicaciones para interactuar con bases de datos. Al final, nuestra aplicación debería:
- Ser capaz de crear datos en la base de datos.
- Ser capaz de leer datos de la base de datos.
- Ser capaz de actualizar datos específicos en la base de datos.
-
- Ser capaz de borrar datos de la base de datos.
Nota
Observa que en nuestro caso, la base de datos está representada por una estructura de datos, una lista, que actualmente nos sirve como solución. En el futuro, en lugar de una simple lista, utilizaremos una base de datos.
Habrás notado que no implementamos el método actualizar en la tarea anterior.
Vamos a hacerlo ahora:
Primero necesitamos obtener el libro por ID** para actualizar un elemento por ID. Para ello, implementaremos un método que recupere el libro por ID. Es mejor hacerlo así que implementar la lógica de obtener un libro por su ID en el método de actualización del libro, ya que podemos reutilizar este método en otras funciones, haciéndolo más versátil.
Library.java
123456789public Book findBookById(int id) { Book result; for (Book book : books) { if (book.getId() == id){ result = book; } } return result; }
La solución anterior es una buena opción, pero hay un pequeño problema. Obtendremos un error si tal ID no existe en nuestra lista. Necesitamos manejar este error y mostrar un mensaje en pantalla indicando que no existe tal libro en la lista (base de datos).
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 la variable resultado
como nulo en esta solución. Después de implementar la búsqueda de libros por ID, realizamos una comprobación para ver si nuestro resultado sigue siendo nulo. Si es true
, creamos un nuevo libro indefinido.
Pasemos a implementar el método de actualización:
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 } } }
Estupendo. Actualizamos el libro actualizando todos sus parámetros. Recomiendo hacerlo de esta forma porque si simplemente reasignamos el libro, pueden producirse errores inesperados. De esta forma, actualizamos el libro por ID, reasignándolo a los parámetros del nuevo libro. Ahora, usemos el método update y veamos qué ocurre:
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); } }
Ahora, la clase Library
tiene todas las operaciones CRUD.
Has hecho un gran trabajo si has comprendido todo esto. Te recomiendo que copies los métodos que he mostrado en este capítulo y los añadas a tu código de la tarea anterior, ya que este código actualizado te será útil más adelante.
1. ¿Qué significa la sigla CRUD?
2. ¿Por qué es necesario implementar operaciones CRUD en tu código?
3. ¿Se pueden utilizar operaciones CRUD con bases de datos?
¡Gracias por tus comentarios!