No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso Avanzado de Java SE

Curso Avanzado de Java SE

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Sentencia INSERT en Java

30/39
Recursos

Aportes 18

Preguntas 8

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

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.

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);

Otro tema màs y seguimos aprendiendo Java avanzado.

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