0

Me conecto a una base de datos MySQL, pero no me deja insertar datos.

package javaapplication2;

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

/**
 *
 * @author Maister
 */
public class RegistroBiblio {

    Connection cn;
    Statement st;
    ResultSet rs;
    String con, nombre="jose", dia="lunes 28";


    public void conectar(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            cn=DriverManager.getConnection("jdbc:mysql://localhost/biblioteca?user=root&password=");
            System.out.println("Conexion");
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }

    }
    public void cerrar() throws SQLException{
        cn.close();
        System.out.println("Cerrar");
    }
    public void insertar(String nombre, String dia){
        try {
            conectar();
            con="insert into tabla (nombre, dia) values ('"+nombre+"', '"+dia+"')";
            st.execute(con);
            System.out.println("Insertar good");
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
        public void insertar2(String nombre, String dia){
        try {
            conectar();
            con="insert into p (uno, dos) values ('"+nombre+"', '"+dia+"')";
            st.execute(con);
            System.out.println("Insertar good");
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
    public void select(String nombre){
        try {
            conectar();
            con="select * from tabla where nombre='"+nombre+"'";
            rs=st.executeQuery(con);
            while(rs.next()){
                nombre=rs.getString("nombre");
                dia=rs.getString("dia");
                System.out.println("Select");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        // TODO code application logic here
        RegistroBiblio a=new RegistroBiblio();
        a.insertar("Jose", "Jueves");
    }

}

¿Cómo resolver el siguiente error?

run:

Conexion

Exception in thread "main" java.lang.NullPointerException

at javaaplication2.RegistroBiblio.insertar(RegistroBiblio.java:45)

at javaaplication2.RegistroBiblio.main(RegistroBiblio.java:81)

C:\Users\Maister\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned:1

BUILD FAILED (total time:0 seconds)

1 Answers1

2

Si cierro los ojos a todos los problemas de diseños que veo, el error específico que tienes debe venir de esta línea:

st.execute(con); // st debe estar a null

Porque si me fijo en tu main:

public static void main(String[] args) {
    // TODO code application logic here
    RegistroBiblio a=new RegistroBiblio();
    a.insertar("Jose", "Jueves");
}

...nunca ejecutas el método conectar() que se ocupa de crear la conección a la base de datos, de modo que cn, st, etc... deben estar a null todavía. Corrección: sí ejecutas conectar() desde el método insertar(), pero conectar() nunca inicializa la variable st, de modo que el problema es el mismo: st está a null.

Interesantemente, hoy también se hizo la pregunta siguiente: ¿Por qué es considerado una mala práctica utilizar variables globales?. Creo que tu caso es un buen ejemplo de porqué es importante evitar las variables globales.

También te recomiendo de revisar el hilo siguiente: ¿Qué es la inyección SQL y cómo puedo evitarla?.

Una recomendación más: Ya que parece que estás usando Netbeans, una herramienta excelente para desarollar programas en Java, aprende a usar el modo "Debug" para investigar y corregir estos problemas. Usando esa técnica, hubieras identificado el problema inmediatamente.

sstan
  • 16,591
  • 2
  • 21
  • 45
  • +1 por hacer notar que el codigo es vulnerable a injeccion SQL. – rnrneverdies Oct 21 '16 at 20:17
  • 1
    Como consejo para agregar a esta respuesta, las conexiones siempre deben ser inicializadas en el ámbito más reducido posible y ser reutilizada al máximo posible en este ámbito. –  Oct 21 '16 at 21:56