Java - Ayuda con Bases de datos

 
Vista:
sin imagen de perfil

Ayuda con Bases de datos

Publicado por Juan Manuel (6 intervenciones) el 13/09/2013 00:28:55
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package boludeces;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;
 
public class ConexionDB {
 
	//JDBC driver y direccion de la BD
	static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
	static final String DATABASE_URL = "jdbc:mysql://localhost/palabra";
 
	private Connection conexion = null;
	private Statement sentencia = null;
	private ResultSet resultSet = null;
 
	public void conectarBD () {
 
		try {
			Class.forName(JDBC_DRIVER); //Carga el driver de JDBC	
 
			//Establece la conexion con la BD
			conexion = DriverManager.getConnection( DATABASE_URL, "juanma", "34410605" );
			System.out.println("La conexion se realizo con exito");
		}
		catch (SQLException sqlExcepcion) {
			sqlExcepcion.printStackTrace();
			System.exit(1);
		}
		catch (ClassNotFoundException classNotFound) {
			classNotFound.printStackTrace();
			System.exit(1);
		}
	} //Fin del metodo ConectarDB
 
	public void generarSentenciaSQL() {
		try {
			sentencia = conexion.createStatement(); //crea la sentencia para empezar la consulta en la BD
			resultSet = sentencia.executeQuery("SELECT palabra FROM palabras");
			while(resultSet.next()){
				System.out.print(resultSet.getString(1) + " ");
			}
			System.out.println(" ");
 
		} catch (SQLException sqlExcepcion) {
			sqlExcepcion.printStackTrace();
		}
	}
	public ResultSet generarSentenciaSQL(String sentencia) { //Genera una sentencia a partir de un string
		try {
			this.sentencia = conexion.createStatement();
			resultSet = this.sentencia.executeQuery(sentencia);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return resultSet;
 
	}
 
	public int tamanoBD() { //calcula el tamaño de la BD
		int tamanoBD = 0;
		try {
			resultSet = sentencia.executeQuery("SELECT COUNT(*) FROM palabras;");
			resultSet.next();
			tamanoBD = resultSet.getInt(1);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return tamanoBD;
	}
 
	public void randomSelector () {
		int tamanoBD = tamanoBD();
		Random rnd = new Random();
		int numero = rnd.nextInt(tamanoBD)+1;
		try {
			resultSet = sentencia.executeQuery("SELECT palabra FROM palabras WHERE idPalabras="+ numero);
			resultSet.next();
			System.out.println(resultSet.getString(1));
		} catch (SQLException e) {
			e.printStackTrace();
		}
 
	}
	public void cerrarConexiones() {
		try {
			conexion.close();
			sentencia.close();
			System.out.println("Cerradas correctamente");
		} catch (Exception excepcion) {
			excepcion.printStackTrace();
			System.exit(1);
		}
	} //Fin del metodo cerrarConexiones
 
	public static void main( String args[] ) {
		ConexionDB conexion = new ConexionDB();
		conexion.conectarBD();
		System.out.println("");
		conexion.generarSentenciaSQL();
		System.out.println("");
		conexion.randomSelector();
		System.out.println("");
		conexion.cerrarConexiones();
	}
}

Este codigo que tengo es sencillo, usa una base de datos llamada "palabra", en especial una tabla llamada palabras que tiene 2 columnas, "idPalabras" y "palabra".
La cuestion es la siguiente, yo quise hacer un randomselector, para seleccionar aleatoriamente un campo de la tabla palabras y lo mostrara por la consola, por ejemplo, si en la tabla hay 3 campos, el random me busca un numero aleatorio del 1 al 3 y luego yo me encargaba de interpretar que ese numero que me devolvia era el idPalabra, el problema puntual es que si en algun momento yo borro algun campo de la tabla, el idPalabra no iba a coincidir con el lugar de la palabra en el campo. Osea que probablemente si agrego la palabra "FIESTA" en la 3º ubicacion de los campos de la tabla, esta iba a tener un idPalabra = 4. Como puedo hacer para evitar esta asociacion y hacerlo mas seguro sin usar el idPalabra como campo de referencia.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con Bases de datos

Publicado por Tom (1831 intervenciones) el 13/09/2013 08:13:16
No es la mejor manera de hacer eso, pero ...
En primer lugar, no debes usar el total de registros, sino el identificador más alto:

1
2
3
resultSet = sentencia.executeQuery("SELECT MAX(IdPalabras) FROM palabras;");
        resultSet.next();
        tamanoBD = resultSet.getInt(1);

Y luego, la cosa es fácil si el IdPalabra aleatorio que quieres no existe, generas otro numero aleatorio y vuleves a probar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda con Bases de datos

Publicado por Juan Manuel (6 intervenciones) el 13/09/2013 16:40:59
claro, entiendo, el tema es el siguiente, la funcion SELECT MAX, me saca el maximo idPalabras, y yo lo que necesito es que no dependa del idPalabras, por ejemplo, si el random saca el nro 5, eso significa que tiene que buscar en la base de datos, en la tabla palabras, el 5 registro y devolver ese, que puede o no tener el idPalabra = 5. No se si me explico
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda con Bases de datos

Publicado por Juan Manuel (6 intervenciones) el 13/09/2013 17:01:26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package boludeces;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;
 
public class ConexionDB {
 
	//JDBC driver y direccion de la BD
	static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
	static final String DATABASE_URL = "jdbc:mysql://localhost/palabra";
 
	private Connection conexion = null;
	private Statement sentencia = null;
	private ResultSet resultSet = null;
 
	public ConexionDB () {
 
		try {
			Class.forName(JDBC_DRIVER); //Carga el driver de JDBC	
 
			//Establece la conexion con la BD
			conexion = DriverManager.getConnection( DATABASE_URL, "juanma", "34410605" );
			sentencia = conexion.createStatement(); //crea la sentencia para empezar la consulta en la BD
		}
		catch (SQLException sqlExcepcion) {
			sqlExcepcion.printStackTrace();
			System.exit(1);
		}
		catch (ClassNotFoundException classNotFound) {
			classNotFound.printStackTrace();
			System.exit(1);
		}
	} //Fin del metodo ConectarDB
 
	public ResultSet generarSentenciaSQL(String sentencia) { //Genera una sentencia a partir de un string
		try {
			this.sentencia = conexion.createStatement();
			resultSet = this.sentencia.executeQuery(sentencia);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return resultSet;
 
	}
 
	public int tamanoBD() { //calcula el tamaño de la BD
		int tamanoBD = 0;
		try {
			resultSet = sentencia.executeQuery("SELECT count(*) FROM palabras;");
			resultSet.next();
			tamanoBD = resultSet.getInt(1);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return tamanoBD;
	}
 
	public String palabraAleatoria () {
		int tamanoBD = tamanoBD();
		Random rnd = new Random();
		int numero = rnd.nextInt(tamanoBD)+1;
		try {
			resultSet = sentencia.executeQuery("SELECT palabra FROM palabras WHERE idPalabras="+ numero);
			resultSet.next();
			return resultSet.getString(1);
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
 
	}
	public void cerrarConexiones() {
		try {
			conexion.close();
			sentencia.close();
			System.out.println("Cerradas correctamente");
		} catch (Exception excepcion) {
			excepcion.printStackTrace();
			System.exit(1);
		}
	} //Fin del metodo cerrarConexiones
 
	public static void main( String args[] ) {
		ConexionDB conexion = new ConexionDB();
		System.out.println("");
		//conexion.generarSentenciaSQL();
		System.out.println("");
		System.out.println(conexion.palabraAleatoria());
		System.out.println("");
		conexion.cerrarConexiones();
	}

Ese es el nuevo codigo que tengo, lo modifique un poquito porque habia cosas que estaban de mas.

PD: se que el codigo o la forma de hacerlo no es la mejor, soy nuevo en esto de las BD y recien estoy empezando, me falta mucho por aprender todavia :) asique paciencia jejeje
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar