Insertar datos con JDBC

07/Jun/2007 Java , , , 35 Comentarios
Programación en Java

Tenemos varias formas de hacer un insert contra una base de datos mediante JDBC. Pero la más sencilla de todas es ejecutar una sentencia INSERT de SQL.

Es por ello que lo primero que vamos a ver es la estructura de dicha sentencia:

INSERT INTO tabla (campo1, campo2,... campoN)
   VALUES (valor1, valor2,... valorN)

Donde campo(s) son los nombres de las columnas de la tabla en los cuales queremos insertar valores. Si queremos rellenar todos los datos de las columnas no hace falta en poner estos campos. Los valores serán, en riguroso orden, los que correspondan con las columnas de las tabla.

En el ejemplo vamos a utilizar la tabla de libros. La cual pasamos a detallar un poco más:

LIBROS
  isbn: char(13)
  idAutor: int(10)
  categoría: varchar(45)
  titulo: varchar(50)
  descripción: text

Veamos los pasos que habría que dar para ejecutar el INSERT mediante una conexión JDBC.

Lo primero es realizar la conexión sobre la base de datos. Para ello necesitamos conocer la URL y los drivers de la base de datos. En nuestro caso, que nos apoyamos en MySQL, sería algo como lo que sigue:

// Definimos el driver y la url
String sDriver = "com.mysql.jdbc.Driver";
String sURL = "jdbc:mysql://localhost:3306/lineadecodigo";

Con los drivers y la URL simplemente tendremos que obtener la conexión (clase Connection) mediante usuario y password.

Connection con = null;
Class.forName(sDriver).newInstance(); 
con = DriverManager.getConnection(sURL,"root","password");

Una vez obtenida la conexión, pasaremos a preparar la sentencia INSERT mediante un PreparedStatement

stmt = con.prepareStatement("INSERT INTO libros VALUES (?,?,?,?,?)");

Una cosa muy importante es que al montar la sentencia INSERT no definimos los valores de la sentencia. En su lugar ponemos interrogaciones (?) que serán sustituidas posteriormente por valores.

Esto se hace para que la sentencia INSERT pueda ser reutilizada con diferentes valores y ser cacheada por los diferentes puntos (cache de conexión de los drivers, cache de la base de datos,…).

Para rellenar los valores simplemente nos podemos valer de los métodos setXXX sobre el PreparedStatement. El valor de XXX dependerá del tipo de dato que manejemos: setString, setDate, setInt,…

Veamos como lo asignaríamos en nuestro ejemplo:

String sISBN = "84-9815-212-7";
String sTitulo = "Yo, Claudio";
String sDescripcion= "Supuesta autobiografía de Claudio...";
String sCategoria = "novela histórica";
int idAutor = 3;
   
stmt.setString(1,sISBN);
stmt.setInt(2,idAutor);
stmt.setString(3,sTitulo);
stmt.setString(4,sDescripcion);
stmt.setString(5,sCategoria);

Ya solo nos quedará ejecutar la sentencia. Cuando la sentencia a ejecutar no devuelve un conjunto de resultados no deberemos de usar executeQuery(), sino que deberemos de utilizar executeUpdate(). Esto es aplicable a INSERT, UPDATE y DELETE.

stmt.executeUpdate();

El valor devuelto por esta sentencia es 1 para sentencias INSERT, UPDATE y DELETE y 0 para sentencias SQL que no devuelven nada.

Al final de nuestro programa no se nos puede olvidar en cerrar las conexiones de la base de datos ;-)

Pero, ¿qué sucede si el valor a insertar (en su clave) ya existe en la base de datos? Pues que nos saltará una sentencia SQLException. En dicha excepción podemos recuperar el SQLState y el SQLErrorCode, los cuales darán información del error.

Vídeos sobre Java


35 comentarios en “Insertar datos con JDBC”

Víctor Cuervo

César Chávez

¿Cómo se hacer para hacer un PreparedStatement que tenga como parámetro un query el cual además de los valores a ser ingresados por el usuario (los que normalmente se hace con el ?), tenga valores ya predefinidos ?

Víctor Cuervo

Víctor Cuervo

Buenas Cesar,

Siempre puedes declarar unas variables con valores constantes que tengan esos valores por defecto. Que es lo que estamos haciendo en el ejemplo con la parte:

String sISBN = "84-9815-212-7";
String sTitulo = "Yo, Claudio";
String sDescripcion= "Supuesta autobiografía de Claudio...";
String sCategoria = "novela histórica";
int idAutor = 3;
   
stmt.setString(1,sISBN);
stmt.setInt(2,idAutor);
stmt.setString(3,sTitulo);
stmt.setString(4,sDescripcion);
stmt.setString(5,sCategoria);

Saludos.

Víctor Cuervo

Uzias

Graciaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas

Víctor Cuervo

Víctor Cuervo

Nos alegramos de tu felicidad. :-D

Víctor Cuervo

Trellat

Un ejemplo muy claro, gracias!

Víctor Cuervo

Víctor Cuervo

Nos alegra que te haya servido.

Saludos.

Víctor Cuervo

Alexander Almonte

quien sabe algo sobre este error: Could not retrieve transation read-only status server, lo hace al intentar esto int g = mb.executeUpdate();

Víctor Cuervo

sandra

pueden explicarme como eso de SQLState y el SQLErrorCode?
Como haria q al agregar el dato si ya existe en la bd me muestra un mensaje diciendo q el dato ya esta registrado. Ayuda plz!

Víctor Cuervo

AARÓN RAMIREZ

utilice este código me funciono sin problemas pero que pasa cuando queremos meter datos a una tabla en la cual una columna es identiti,

Como indicar que en esta columna no ingrese nada.

Víctor Cuervo

Víctor Cuervo

@Paola, ¿Que quieres decir con interface?
A ver si te podemos ayudar.

Víctor Cuervo

Paola

Disculpa pero como le hago para ingresar datos a la base de datos pero por medio de una interface? la cual le tengo creada con .jsp

Víctor Cuervo

Esteban

Compadre estuve todo el dia buscado pq no me actulizaba la tabla y con esto lo hice
stmt.executeUpdate();
te agradesco mucho bro me salvaste el dia….
BKN PERROOOOOOOOOO

Víctor Cuervo

lineadecodigo

@JC,

Comparte el código con nosotros en el foro para poderte ayudar de mejor forma
http://www.dudasprogramacion.com/forum/java-database-connectivity-jdbc

Víctor Cuervo

lineadecodigo

@David,

Si uno de los campos no tiene ne valor tienes que comprobar que deja insertar la base de datos. Es decir, si acepta nulos o no.

Si no acepta nulos deberá de dejar el campo vacío con un valor por defecto » » si es una cadena, 0 ó -1 ó un numero no representativo si es un número,…

En el caso de que se admitan nulos utiliza NULL

INSERT INTO libros VALUES (?,?,?,?,NULL)

Víctor Cuervo

J.C

Saludo, tengo un codigo para insertar datos en mi programa. Cuando lo ejecuto me dice q establece la conexion con la bd pero deseo insertar algun registro y no lo realiza. Lanza esta exception ( column count doesn`t mach value count at row 1). Q podra ser ese problema?

Víctor Cuervo

David

Hola.

Y si en uno de los campos quiero insertar valor NULL, porque estoy leyendo de un fichero y uno de los campos no tiene datos. Como lo haría. Como construiría esa sentencia??

Graicas

Víctor Cuervo

juan_zero

no sé la sintaxis que se debe utilizar para enviar el contenido de una variable que cambiará de valores en la ejecucion de un programa hacia la base de datos. uso mysql y eclipse…Espero tus respuestas

Víctor Cuervo

Marvin

se puede hacer esto utilizando Jsf.

Víctor Cuervo

Marcelo

En el ejemplo de descarga esta todo, pero en el tutorial te olvidaste de poner PreparedStatement stmt = null;

Gracias, me sirvio!

Víctor Cuervo

lineadecodigo

@RODRIGO CAMPOS RAMOS,

Tienes un Foro de NetBeans dónde quizás puedas exponer tus dudas para que te ayuden.

Espero que sea de ayuda. :-)

Víctor Cuervo

RODRIGO CAMPOS RAMOS

muchas gracias de eso me di cuenta hace 1 minuto. ahora en prestaciones o service(en ingles) en netbeans si es que sabes, tengo que jugar con algo mas para que resulte todo.

muchas gracias.

Víctor Cuervo

lineadecodigo

@RODRIGO CAMPOS RAMOS,

¿Has importado la librería java.sql? Es decir tienes la sentencia import java.sql.*; al principio de la clase??

Víctor Cuervo

RODRIGO CAMPOS RAMOS

hola amigos, bueno les escribo y es que me muestra un error al escribir esta linea de codigo en netbeans en a BD en mysql.

Connection con = null;
Class.forName(sDriver).newInstance();
con = DriverManager.getConnection(sURL,»root»,»password»);
-el error es que no encuentra la clase Connection
-no encuentra la variable DriverManager().

ojala me puedan ayudar.
gracias

Víctor Cuervo

lineadecodigo

@PEDRO GOVEA QUOÑONES,

Podría ser algo así:
// Definimos el driver y la url
String sDriver = «oracle.jdbc.driver.OracleDriver»;
String sURL = «jdbc:oracle:thin:@localhost:5521:lineadecodigo»;

Los drivers JDBC de Oracle, así como documentación al respecto, lo tienes disponible en Drivers JDBC Oracle

Víctor Cuervo

PEDRO GOVEA QUOÑONES

pARA CONECTAR CON ORACLE COMO LO HARIA SI DICE CON CON MYSQL
com.mysql.jdbc.Driver»;
String sURL = «jdbc:mysql://localhost:3306/lineadecodigo»;

Víctor Cuervo

lineadecodigo

@diana,

Te recomiendo que expongas tu problema, adjuntando el código en el Foro de JDBC.

Y así podamos ayudarte.

Víctor Cuervo

diana

P.D. utilizo netbeans 6.5

Víctor Cuervo

diana

ola!!! tengo un problema intento insertar con un codigo similar de java a una base de datos en oracle pero al ejecutar el programa este no inserta se queda corriendo sin hacer nada alguien me podria ayudar

Víctor Cuervo

luis gabriel

nesecito insertar a mi base de datos oracle 5 campos desde cajas de inputtext en netbeans6.5.1..

Víctor Cuervo

lineadecodigo

@lalo,

La variable stmt es del tipo PreparedStatement. Del paquete java.sql.

Víctor Cuervo

lalo

me parese exelente
solo que me gustaria saber de que tipo es la variable stmt
GRACIAS!!

Víctor Cuervo

lineadecodigo

Mary, échale un vistazo a Consultas SQL con parametros en Java JDBC y Conectarnos a una base de datos con JDBC. A ver si te son de ayuda.

Víctor Cuervo

mary

por fa podrian realizar esto pero para una seleccion atravez del jdbc no se si este select puede estar dentro de una funcion y luego utilizar el setinterval.

Víctor Cuervo

gisella

muy execelente los codigos pro me gustaria que si me pudieran alguna opinion acerca de capas en visual.net

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*