No tienes acceso a esta clase

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

CRUD: inserción de datos

11/25
Recursos

Aportes 53

Preguntas 10

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Algo que puede mejorar un poco el rendimiento de la aplicacion son los patrones de diseño, en este caso para no estar creando una conexión de la base de datos en cada operación CRUD, se puede hacer un patron singleton para que verifique si ya existe el objeto creado y no crear mas instancias y con eso ahorrar memoria, este enfoque depende también de la cantidad de usuarios que se vayan a conectar, ya que si hay más usuarios, muy probablemente la conexión se deba hacer mediante un pool de conexiones.

Un saludo para todas las personas que ven este video, actualicé el proyecto en mi repositorio de github con buenas prácticas.

“En informática, CRUD es el acrónimo de “Crear, Leer, Actualizar y Borrar” (del original en inglés: Create, Read, Update and Delete), que se usa para referirse a las funciones básicas en bases de datos o la capa de persistencia en un software.”

Que hay, al parecer no fui el unico con el problema de la fecha en el constructor, al momento de ingresar el query, deberan dejar la variable fecha_mensaje y en el valor deberan poner la fecha actual capturada

String query= “INSERT INTO mensajes (mensaje, autor_mensaje, fecha_mensaje) VALUES (?,?, CURRENT_DATE())”

Espero haber ayudado con ese problema que me tenia atorado y seguro a alguno de uds igual lo tendra

Ese hermoso momento en que todo funciona como debería funcionar y el código hace lo que debe hacer. Ese momento define un momento de felicidad.

Un detalle nomas insignificante , el case 3 es el 4 y el 4 es el 3.

¿Aquí también es donde se puede usar los procedimientos almacenados?

Así quedó mi clase “Config” que sería la clase “Conexión” del profesor pero aplicando el patron “Singleton” y evitar crear multiples instancias de la base de datos cada vez que creamos un mensaje.

Para obtener la conexión lo tengo de esta manera en la clase DAO:

Muy bueno, estaría excelente un curso de PLSQL para procedimientos almacenados ya que en mi trabajo ven como mala practica colocar los querys en el código.

Patron Singleton para conectar a la base de datos:

package service;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;

public class ConnectDatabase {
    private static Connection myConnection;

    private ConnectDatabase() {
    }

    public static Connection getConnection() throws SQLException {
        if (myConnection == null || myConnection.isClosed()) {
            try {
                myConnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/app_messages", "root", "");
            } catch (SQLException e) {
                System.out.println(e);
            }
        }
        return myConnection;
    }
}

si alguno tiene problema con el ide net beans versión 16 con la base de datos, copie el archivo pom.xml que esta en los recursos,

Excelente curso del CRUD

Definicion del metodo ‘Try Catch’ segun wikipedia: Try se utiliza cuando se desean prever excepciones en el transcurso de la ejecución de un programa. Es necesario ya que ahí se colocan las instrucciones que se desean realizar pese a la excepción, posteriormente se usa un catch donde se especifica la excepción que se sabe puede ocurrir.
https://es.wikibooks.org/wiki/Programación_en_Java/Sentencia_try

Muy buena clase y explicación !

Excelso!

Amig@s, hice este pequeño diagrama conectando los 5 archivos .java que hemos creado hasta ahora.
Espero les ayude, porque para algunos este tema de persistencia de datos es nuevo y un poco enredado 😉. Saludos!!

![Create Method](

Como ya lo mencionaron otros comentarios, es una mala practica crear una nueva conexion cada vez que se haga una peticion, esto se resuleve con el patron Singleton, asi generamos una sola instacia de la conexion.

package com.platzi.mensajes_app;

import java.sql.*;

public class Conexion {

    private static Conexion dataSource = null;
    private Connection con;

    private Conexion (){
        Connection conection = null;

        try{
            String url = "jdbc:mariadb://localhost:3306/mensajes_app";
            String user = "root";
            String password = "maria123";
            conection = DriverManager.getConnection(url,user,password);
            if(conection != null) {
                System.out.println("Conexion exitosa");
            }
        }catch (SQLException e){
            System.out.println(e);
        }
    }
    public static Conexion getInstance()
    {
        if (dataSource == null){
            dataSource = new Conexion();
        }
        return dataSource;
    }

    public boolean runExecuteUpdate(String sql)
    {
        int rows=0;
        try {
            Statement statement = con.createStatement();
            rows = statement.executeUpdate(sql);
            System.out.println("Successful query: "+sql);
            return true;
        } catch (SQLException e) {
            System.out.println("Query error: "+e.getMessage());
            return false;
        }
    }

    public ResultSet runQuery(String sql)
    {
        ResultSet resultSet = null;
        try {
            Statement statement = con.createStatement();
            resultSet = statement.executeQuery(sql);
            System.out.println("Successful query: "+sql);
        } catch (SQLException e) {
            System.out.println("Query error: "+e.getMessage());
        }
        return resultSet;
    }

}

Bueno, pese a los malos comentarios que se dicen, estoy aprendiendo cosas nuevas en este curso.

Como aporte, podrian usar el siguiente repositorio que permite hacer esos try catch que ensucian el codigo con lambdas.
https://mvnrepository.com/artifact/io.vavr/vavr/0.10.3

ejemplo de implementacion:

Try.of( () -> mensajeService.createMensaje(new Mensaje("this is a new message"
                        , LocalDateTime.now().toString()
                        , "Slasher"))
        ).onFailure(Throwable::printStackTrace);

1:20 no entiendo esto de java ¿Se pasa la declaración de una variable en el try? umm ¿por qué un try tiene para metros exactamente?

magnifico

Excelente

Hola, buenas compañeros!!
Muy interesante todas las implementaciones con el patrón singleton. Lo puse en práctica.
Sólo comento que , según tengo entendido, no es necesario el throws SQLException en las firmas de los métodos para abrir y/o cerrar conexiones si es que la expecipon se está atrapando dentro del método con un bloque catch.
Éxitos!!

Para los que están experimentando problemas con la conexión de bases de datos con el error “java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/”, les dejo la solución:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DBConnection {

public Connection get_connection(){
    
    Connection db_connection = null;
    
    try{
        
        String url = "jdbc:mysql://localhost:3306/mensajes_app"; 
        Properties info = new Properties(); 
        info.put("user", "root"); 
        info.put("password", ""); 
        
        db_connection = DriverManager.getConnection(url, info);
        
    }catch(SQLException ex){
        System.out.println("DB Error Connection: " + ex);
    }
    
    return db_connection;
}

}

hola

Se deberia cerrar la conexion a la base de datos despues de hacer la operacion.

Me salía el siguiente error :

java.sql.SQLException Índice de parámetro fuera de rango (1 > número de parámetros, que es 0) [cerrado]

La solución fue:

 public static void crearMensajeBD(Mensajes mensaje){
        try{
            Connection cn = Conexion.conexion();
        PreparedStatement ps = cn.prepareStatement(
        "INSERT INTO mensajes VALUES (?,?,?,current_timestamp(),current_timestamp(),current_timestamp())"
        );
            ps.setInt(1,0); // enviar como 0 el id, ya que en bd, está AI
            ps.setString(2,mensaje.getMensaje());
            ps.setString(3,mensaje.getAutor_mensaje());
            ps.executeUpdate(); // ejecutar 
            ps.close(); // cerrar conexion
            
            JOptionPane.showMessageDialog(null,"Mensaje creado correctamente...");
        } catch (SQLException ex){
            System.out.println(ex);
            
        }
    }

Mis felicitaciones , uno de los mejors cursos de platzi

CURRENT_TIMESTAMP() con este método pueden agregar la fecha a la base de datos.

Me gustó esta clase, es la primera en la que se va a lo práctico en cuanto a JDBC.

Agradezco que el curso sea full practica, siendo nuevo, siento que estoy avanzando, incluso pude identificar algunos inconvenientes adrede realizador por el profesor, que desde mi posición, puedo identificar y eso me motiva a seguir estudiando y saber que estoy aprendiendo, Gracias Profe!.

No lei los comentarios sino hasta que ya lo había terminado, resolví hacerlo con un singleton.

package com.reymar.persistencia_datos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConexionBD {

	private static Connection connection = null;
	
	public static Connection getConnection() {
		if (connection != null)	return connection;
		
		try {
			String url = "jdbc:mysql:// localhost:3306/org";
			String database = "mensajes_app";
      String user = "root";
      String pass = "";
        
			// Si el programa se cierra se ejecuta getClose
			Runtime.getRuntime().addShutdownHook(new getClose());
			connection = DriverManager
					.getConnection(url.concat(database), user, pass);
			
			return connection;
			
		} catch (SQLException e) {
			throw new RuntimeException("Error al conectarse a la DB %s", e);
		}
	}
	
	static class getClose extends Thread{
		@Override
		public void run() {
			try {
				Connection connection = ConexionBD.getConnection();
				connection.close();
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
	}

}

Por que usar Prepared Statement en nuestro codigo?
Me llama la atención la definición que da oracle acerca de esta interface que nos permite ejecutar eficientemente nuestra sentencia sql y evitar ataques sql.
Interface PreparedStatement
An object that represents a precompiled SQL statement.

A SQL statement is precompiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

Note: The setter methods (setShort, setString, and so on) for setting IN parameter values must specify types that are compatible with the defined SQL type of the input parameter. For instance, if the IN parameter has SQL type INTEGER, then the method setInt should be used.

If arbitrary parameter type conversions are required, the method setObject should be used with a target SQL type.

Tomado de Oracle

Porque un try dentro de otro try sabiendo que con el primero se puede controlar las excepciones, quedo en duda de esta clase con las malas practicas de programación. Al igual de hacer una conexión para cada query se debe hacer una conexión global. Y los métodos de las clases static también son muy mala practica de programación.

Estupenda clase instructor Santiago, sobre inserción de datos y desarrollo de avisos en caso de éxito o error.

Buen curso !

Esto fue tan genial!!!

Listo 😃

Excelente Curso, muy practico, esto sirve para aprender, genial

Simplemente genial.

Tuve algunos problemas, pero fueron por ejemplo guardando el nombre en el registro lo hice mal y pues me salia null :v. Al final envio el mensaje correctamente.

¡Es como magia!
Estaba intentando hacer lo mismo con PHP sin embargo tenía un error en la conexión con la base de datos, ahora haciéndolo con Java, es una maravilla.

Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.5.0:exec (default-cli) on project mensajes_app: Command execution failed. Process exited with an error: 1 (Exit value: 1) -> [Help 1]

To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.

For more information about the errors and possible solutions, please read the following articles:
[Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

me aparece ese mensaje, hice todo igual , uso sqlworkbench y netbeans ayuda por favor

Interesante la clase, investigue un poco por fuera, y aprendí que los prepared statement son funciones de la base de datos no del lenguaje, algo que de verdad desconocía.

Orale wey por fin el tan esperado momento de enviarle a una base de datos inf we :v

Les dejó está pequeña anotación que yo agregué en mis apuntes. Quizás a alguno le interese tenerla.
En computación CRUD es el acrónimo de Crear, Leer, Actualizar y borrar (Create, Read, Update and Delete). Se usa para referirse a las funciones básicas en bases de datos o la capa de persistencia en un software.

Me sale este erro

java.sql.SQLException: The server time zone value 'unknown' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
Exception in thread "main" java.lang.NullPointerException
	at com.cursobdd.mensajes_app.MensajesDAO.crearMensajeDB(MensajesDAO.java:24)
	at com.cursobdd.mensajes_app.MensajesService.crearMensaje(MensajesService.java:30)
	at com.cursobdd.mensajes_app.Inicio.main(Inicio.java:36)
Command execution failed.
org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
	at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:404)
	at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166)
	at org.codehaus.mojo.exec.ExecMojo.executeCommandLine(ExecMojo.java:764)
	at org.codehaus.mojo.exec.ExecMojo.executeCommandLine(ExecMojo.java:711)
	at org.codehaus.mojo.exec.ExecMojo.execute(ExecMojo.java:289)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)```

Super cool!


Saben qué debo hacer para que me salga la fecha?

Me esta gustando demasiado el curso, pero estaría bien que explicara mas a fondo los métodos que estamos utilizando de las librerías descargadas

La clase más los aportes me ayudan mucho.

lo modifique un poco xq me volvio loco y no me andaba. Asi lo pude hacer andar en Intellij (cambie xq me volvio loco node, no me gusta jaja

<code>
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class MensajesDAO {
    public static void crearMensajeDB(Mensaje mensaje) {
        Conexion cnx = new Conexion();

        try (Connection connection = cnx.getConnection()) {
            final String query = "INSERT INTO mensajes (mensaje, autor_mensaje) VALUES (?,?)";

            PreparedStatement ps = connection.prepareStatement(query);
            ps.setString(1, mensaje.getMensaje());
            ps.setString(2, mensaje.getAutor());
            ps.executeUpdate();

            System.out.println("Mensaje Creado Piola");
        } catch (SQLException e) {
            System.out.println(e);
        }
    }

)