
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


0