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.

鈥淓n inform谩tica, CRUD es el acr贸nimo de 鈥淐rear, 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= 鈥淚NSERT 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 鈥淐onfig鈥 que ser铆a la clase 鈥淐onexi贸n鈥 del profesor pero aplicando el patron 鈥淪ingleton鈥 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 鈥楾ry 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 鈥渏ava.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);
        }
    }

)