Por que el método setMovieViewed() no es void? No sirve de nada que regrese un objeto de tipo movie, de hecho en el vÃdeo ni siquiera se guarda esa respuesta en una variable.
Introducción al Curso
Bienvenidos al Curso Avanzado de Java SE
Clases avanzadas
Clases Abstractas
Implementando clases abstractas al proyecto
Ejercicio. Clases Abstractas
Implementando métodos abstractos en Java
JavaDocs
Qué es JavaDocs
Implementando JavaDocs al proyecto
Reto
JavaDocs tags para herencia e interfaces
Generado Java Docs
Clases Anidadas
Clases anidadas y tipos
Ejercicio. Clases Anidadas
Implementando una clase anidada al proyecto
Instanciando clases estáticas anidadas
Enumerations
Interfaces Avanzadas
Métodos con implementación métodos default y private
Creando Interfaz DAO con métodos default y private
Ejercicio. Interfaz DAO
Diferencia Interfaces y Clases Abstractas
Herencia en Interfaces
Colecciones Avanzadas
Map, HashMap, TreeMap y LinkedHashMap
Excepciones
Manejo de errores
Try-catch-finally / Try-with-resources
JDBC
Definición y composición del API
Ejercicio. JDBC API
Creando la base de datos y conectando el proyecto con MySQL
Generando conexión a la base de datos y creando clase de constantes
Sentencia SELECT en Java
Sentencia SELECT con Parámetros
Sentencia INSERT en Java
Reto: Reporte por fecha
Lambdas
¿Cómo resolver el reto: reporte por fecha?
Interfaces funcionales
Programación Funcional
Lambdas
Ejercicio. Lambdas
Lambdas como variables y Recursividad
Stream y Filter
Predicate y Consumer
Fin del Curso
Conclusión del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Anahà Salgado DÃaz de la Vega
Aportes 18
Preguntas 8
Por que el método setMovieViewed() no es void? No sirve de nada que regrese un objeto de tipo movie, de hecho en el vÃdeo ni siquiera se guarda esa respuesta en una variable.
Acá dejo mi versión de la interface MovieDAO
package com.erosennin.amazonviewer.dao;
import com.erosennin.amazonviewer.db.IDBConnection;
import com.erosennin.amazonviewer.model.Movie;
import java.sql.*;
import java.util.ArrayList;
import static com.erosennin.amazonviewer.db.DataBase.*;
public interface MovieDAO extends IDBConnection {
default ArrayList<Movie> read() {
ArrayList<Movie> movies = new ArrayList<>();
try(Connection connection = connectDB()) {
String query = String.format("SELECT * FROM %s", TMOVIE);
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
Movie movie = new Movie(
resultSet.getInt(TMOVIE_ID),
resultSet.getInt(TMOVIE_DURATION),
resultSet.getString(TMOVIE_TITLE),
resultSet.getString(TMOVIE_GENRE),
resultSet.getString(TMOVIE_CREATOR),
resultSet.getShort(TMOVIE_YEAR));
movie.setViewed(getMovieViewed(connection, resultSet.getInt(TMOVIE_ID)));
movies.add(movie);
}
} catch(SQLException e) {
e.getMessage();
}
return movies;
}
default void setMovieViewed(Movie movie) {
String query = String.format("INSERT INTO %s (%s, %s, %s) VALUES (" +
"(SELECT %s FROM %s WHERE %s = '%s'), %s," +
"(SELECT %s FROM %s))",
TVIEWED, TVIEWED_ID_MATERIAL, TVIEWED_ID_ELEMENT, TVIEWED_ID_USER,
TMATERIAL_ID, TMATERIAL, TMATERIAL_NAME, TMOVIE,movie.getId(),
TUSER_ID,TUSER);
try(Connection connection = connectDB()) {
Statement statement = connection.createStatement();
statement.executeUpdate(query);
} catch (SQLException e) {
e.getMessage();
}
}
private boolean getMovieViewed(Connection connection, int idMovie) {
String query = String.format("SELECT * FROM %s WHERE %s = " +
"( SELECT %s FROM %s WHERE %s = '%s' ) " +
"AND %s = ? AND %s = " +
"( SELECT %s FROM %s )",
TVIEWED, TVIEWED_ID_MATERIAL, TMATERIAL_ID, TMATERIAL,TMATERIAL_NAME,
TMOVIE, TVIEWED_ID_ELEMENT, TVIEWED_ID_USER, TUSER_ID, TUSER);
boolean viewed = false;
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, idMovie);
ResultSet resultSet = preparedStatement.executeQuery();
viewed = resultSet.next();
} catch (SQLException e) {
e.getMessage();
}
return viewed;
}
}
Usé el metodo String.format() para facilitar la lectura de los queries e hice uso de queries anidados para recuperar el id_material y el id_user de la bases de datos en vez de tenerlos "quemados "en el código.
Otro tema màs y seguimos aprendiendo Java avanzado.
Por que crean una instancia de la clase Movie para llamar el metodo setMovieViewed()? Esto no es necesario, pueden llamar el metodo simplemente asi:
setMovieViewed(this);
Una mejor forma serÃa hacer void a setMovieViewed
default void setMovieViewed(Movie movie)
y ejecutarla asi
@Override
public void view() {
setViewed(true);
Date dateI = startToSee(new Date());
setMovieViewed(this);
for (int i = 0; i < 100000; i++) {
System.out.println("..........");
}
//Termine de verla
stopToSee(dateI, new Date());
System.out.println();
System.out.println("Viste: " + toString());
System.out.println("Por: " + getTimeViewed() + " milisegundos");
}
Muy buena clase.
Excelente lo de pasar (this) .
😃
buena clase!!!
Excelente material 😄
muy buen ejemplo, solo algo, si le vuelves a da 4 te crea un nuevo registro
Excelente Explicación
Lo puedes poner como visto de esta manera (mas corta y no confunde cual movie es)
new Movie().setMovieViewed(this);
mi versión del query complejo
String query = String.format("INSERT INTO %s (%s, %s, %s) VALUES (" +
"(SELECT %s FROM %s WHERE %s = '%s'), %s," +
"%s)",
TVIEWED, TVIEWED_IDMATERIAL, TVIEWED_IDELEMENT, TVIEWED_IDUSER,
TMATERIAL_ID, TMATERIAL, TMATERIAL_NAME, TMOVIE, movie.getId(),
TUSER_IDUSUARIO);
Excelente explicación de como hacer insert sin embargo yo prefiero usar PreparedStatement para la inserción de los datos, es mucho mas legible y comprensible
Excelente muchas gracias 😃
Desde StackOverflow:
To manipulate data you actually need executeUpdate() rather than executeQuery().
Here’s an extract from the executeUpdate() javadoc which is already an answer at its own:
Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.
Les aconsejo que en vez de imprimir 1 millon de puntitos en consola para simular que la pelicula se esta viendo.
Solo impriman 10, o una cantidad que NO OCULTE la excepcion que tira executeQuery cuando queremos hacer un INSERT.
Saludos!
buena explicación tuve algunos detalles con la consulta pero ya bien
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?