20260519 AccesoBD_6 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Bueno, pues efectivamente, esto es feo, ¿verdad? Que tan fácilmente podamos extraer toda la información de una base de datos, pues es feo.
00:00:01
Vale, entonces, este tipo de sentencias hay que usarlas con limitaciones. En ciertos contextos son las más rápidas, porque el acceso a una base de datos muchas veces es el cuello de botella de una aplicación.
00:00:22
Entonces lo del tiempo de acceso no es una tontería
00:00:34
Y estas sentencias son las más rápidas
00:00:37
Pero tienen este problema
00:00:39
Entonces tenemos la posibilidad de hacer este método
00:00:40
Sin que nadie pueda hacer esta inyección SQL de aquí
00:00:44
Entonces vamos a hacer este método
00:00:50
Pero con una versión ya segura
00:00:52
Pongo aquí versión segura
00:00:53
Versión segura
00:01:08
Vale, de este método
00:01:14
Bueno, pues la conexión es igualita
00:01:15
la misma, pero ahora nuestra
00:01:19
sentencia no va a ser de tipo statement
00:01:21
¿vale?
00:01:23
entonces, como va a ser más larga
00:01:26
vamos a quitarla del
00:01:27
de este de aquí
00:01:29
para no hacer un try con recursos tan grandote
00:01:31
la quito de aquí
00:01:34
entonces nuestra sentencia ahora va a ser
00:01:37
del tipo
00:01:39
prepared
00:01:40
prepared
00:01:42
statement
00:01:46
que también se crea a partir de la
00:01:48
conexión, pero en lugar de con
00:01:53
createStatement, se crea con
00:01:55
prepare
00:01:57
prepareStatement
00:01:57
está
00:02:02
aquí, y aquí
00:02:02
con esto
00:02:11
estamos precompilando
00:02:13
una primera sentencia
00:02:16
¿vale? precompilando una primera
00:02:17
sentencia que todavía no se está ejecutando
00:02:19
aquí le damos el SQL
00:02:21
que queremos hacer
00:02:23
el SQL que queremos hacer, ¿cuál es?
00:02:24
queremos hacer este
00:02:27
select asterisco
00:02:29
from
00:02:32
personas
00:02:33
minúscula
00:02:36
que queda más bonito
00:02:37
personas
00:02:38
where
00:02:41
nombre
00:02:43
igual y aquí era donde venía
00:02:45
el problema
00:02:48
que yo aquí directamente concatenaba
00:02:48
con lo que me habían mandado desde fuera
00:02:52
concatenaba tal cual
00:02:54
pues aquí no concateno con nada
00:02:55
aquí pongo una interrogación
00:02:57
y digo, oye, yo voy a ejecutar una sentencia
00:02:58
de esta estructura
00:03:04
y aquí va a entrar algo
00:03:06
que tiene que ser un parámetro válido para esto de aquí
00:03:11
entonces, te estoy avisando de que esto es un select
00:03:14
un select con un único parámetro
00:03:17
o sea, aquí no puedes luego añadirme un or
00:03:20
ni un script, ni nada
00:03:24
con esto estamos diciendo, aquí solamente vas a poder añadir
00:03:26
un parámetro para nombre
00:03:31
y el resultado va a ser
00:03:32
una select con una búsqueda
00:03:35
por un único parámetro
00:03:37
aquí no cabe
00:03:38
ni luego un or después
00:03:41
ni luego un script, no cabe nada
00:03:42
en esta sentencia solo va a caber un select
00:03:44
con un único parámetro
00:03:46
con el valor que sea
00:03:48
entonces estamos dándole un aviso de que eso es lo único
00:03:50
que se va a poder hacer
00:03:53
ahora ya
00:03:53
esto por ahora ya lo modificaremos
00:03:55
verificaremos. Ahora le damos los parámetros, le decimos, oye tú, sentencia que te estoy
00:03:59
preparando, la primera interrogación que hay, sustituyela, como es un string, pongo
00:04:05
setString, la primera interrogación que hay, sustituyela con lo que yo te diga. Empezando
00:04:17
desde el 1. Si esta SQL, esta sentencia
00:04:23
tuviera más interrogaciones, porque yo busco por más
00:04:30
where nombre, and, edad, no sé qué, si tuviera más interrogaciones
00:04:34
pues las iría fijando todas. Set string, 1 nombre
00:04:38
set int, 2 edad, lo que fuera.
00:04:42
Pero con esta estructura ya estoy diciendo exactamente lo único
00:04:46
que se va a poder ejecutar. Exactamente esto. Cualquier otra
00:04:50
cosa, que vaya aquí
00:04:54
dentro, que no sea exactamente
00:04:56
un valor de parámetro para esto,
00:04:58
pues eso ya no lo va a ejecutar.
00:05:01
Entonces,
00:05:03
ahora ya falta ejecutarlo. Vale, pues para
00:05:04
ejecutarlo, con hacer el execute query,
00:05:06
ya no hay que darle nada, porque ya está hecho,
00:05:08
ya estaría ejecutado.
00:05:10
PS.
00:05:13
Ya está.
00:05:16
Ahora aquí ya es imposible hacer
00:05:18
la inyección.
00:05:20
100%. Podemos probarlo.
00:05:24
Entonces, la clave
00:05:29
en lugar de una statement normal
00:05:30
hacer una prepare de statement
00:05:32
que lo primero
00:05:34
que hace es decir, oye, este es
00:05:36
el tipo de SQL que vamos a hacer
00:05:38
este
00:05:40
una select con un parámetro
00:05:40
de búsqueda con
00:05:44
este valor, con lo cual aquí
00:05:46
solo se admiten cosas
00:05:50
que sean valores para nombre
00:05:52
es imposible
00:05:53
a partir de aquí que me aparezca
00:05:56
una concatenación con cosas que no sean valores
00:05:58
para nombre porque ya está avisada
00:06:00
el prepara statement de que solo puede ser eso
00:06:02
una vez que ya está este avisado
00:06:03
con sus interrogaciones se van fijando
00:06:06
una por una, en nuestro caso solo hay una
00:06:07
que fijar, pues ya está fijada
00:06:10
y ahora ya ejecutamos
00:06:12
la query
00:06:14
la ejecutamos
00:06:14
y una vez que tengo los registros procedo exactamente
00:06:16
igual, entonces ahora
00:06:20
si nosotros
00:06:27
volvemos a intentar
00:06:29
voy a cambiar en el main
00:06:31
para que ahora llame al 2
00:06:35
al que es seguro
00:06:37
que era getPersonasByNombre
00:06:38
2
00:06:41
cambiamos a la versión 2
00:06:42
cambiamos a la versión 2
00:06:44
recupera personas por nombre
00:06:47
vamos a darle
00:06:49
esta, que era la peligrosa
00:06:51
no me saca nada
00:06:53
porque entonces
00:06:56
ahora ya si, lo que busca es una persona
00:06:57
que se llame así
00:06:59
no hay ninguna persona que se llame así
00:07:00
con lo cual no recupera
00:07:02
Vale, ahora ya, no, esto es solamente el parámetro nombre, eso es.
00:07:04
Entonces, no lo hay, pues no lo recupero.
00:07:10
Vale, entonces este tipo de sentencia,
00:07:17
este tipo de sentencia es más larga de hacer,
00:07:19
porque hay que ir fijando las interrogaciones,
00:07:24
pero lógicamente es más segura.
00:07:26
claro, imagínate, vamos a hacer
00:07:28
para que tenga varios, un método
00:07:52
que devuelva
00:07:53
todas las
00:07:55
personas cuyo nombre
00:08:00
empieza
00:08:02
por
00:08:04
A y son mayores de edad
00:08:04
por ejemplo
00:08:07
a ver, public
00:08:08
static
00:08:11
get personas
00:08:13
mayores edad
00:08:16
by inicial
00:08:21
venga, le damos una inicial
00:08:23
que me devuelva
00:08:27
todas las personas con esa inicial
00:08:40
mayores de edad
00:08:42
vale, vamos a copiar
00:08:44
esto y lo
00:08:48
retocamos
00:08:49
vale, mi array list de personas
00:08:51
ahora, tengo que construir el SQL
00:09:00
entonces, vosotros aquí sois los
00:09:02
expertos en SQL
00:09:04
¿cómo se pone la condición
00:09:05
de que un nombre
00:09:08
un campo
00:09:10
de marchar empiece por un carácter?
00:09:12
vale, vamos a
00:09:15
comprobarlo aquí
00:09:16
ver nombre, like
00:09:17
el carácter
00:09:19
¿qué?
00:09:23
¿me has dicho?
00:09:24
no, pero era comilla por sentación
00:09:26
¿comilla?
00:09:27
sí, comilla simple
00:09:29
bueno, debería ser
00:09:30
no, a por sentación
00:09:34
Ah, porcentaje
00:09:35
Sí, porque
00:09:36
Porcentaje significa
00:09:38
Cero o más o varios
00:09:39
Vale, sí, lo que pasa es que este ejemplo no nos gusta
00:09:42
Porque
00:09:45
Para hacer con este
00:09:45
Hay que
00:09:49
Habría que hacer otra sentencia
00:09:50
Habría que fijarlo
00:09:53
Entonces, no, no nos
00:09:54
Vamos a complicar
00:09:57
Ahora, porque tendríamos que incorporar otro tipo de sentencia
00:09:59
Entonces, que se llamen de una manera
00:10:01
Siendo mayores de edad
00:10:04
Todos los pepitos mayores de edad
00:10:05
Así no nos complicamos
00:10:06
Vale, get personas mayores de edad
00:10:08
Por nombre
00:10:13
Vale
00:10:14
Entonces ahora
00:10:15
Añadiríamos where nombre igual a este
00:10:18
And, ahora ya sí
00:10:21
And
00:10:22
Edad igual a otra interrogación
00:10:23
¿Verdad?
00:10:28
No, mayor o igual, perdón
00:10:31
Que el mayor o igual en SQL es ese
00:10:32
¿No?
00:10:36
¿Es ese?
00:10:37
El mayor o igual en SQL
00:10:40
vale, entonces
00:10:41
ahora yo, mi nombre es este
00:10:47
y me fijo la otra interrogación
00:10:50
ps.setint
00:10:52
la interrogación
00:10:54
2 igual a
00:10:56
18, ahora
00:10:58
este me sacará solo los mayores
00:11:03
de edad que se llaman así
00:11:05
anedadman
00:11:07
dos interrogaciones, fijo los dos valores
00:11:09
y me saca esas personas
00:11:11
entonces si pongo
00:11:15
Voy a poner otra Ana
00:11:16
Pero más pequeña
00:11:22
Con 12 años
00:11:25
Ahora tengo dos que se llaman Ana
00:11:27
Pero solo una es mayor de edad
00:11:31
Vamos a
00:11:33
Comprobarlo
00:11:35
Personas
00:11:45
Mayores de edad
00:11:51
De edad por nombre
00:11:53
El caso 4
00:11:59
Sería como el
00:12:01
3
00:12:02
Pero cambiando el método
00:12:04
El caso 4
00:12:05
Un segundito
00:12:09
Operaciones de personas mayores de edad
00:12:10
Vale, ya tengo el caso 4
00:12:16
Que son solo las mayores de edad
00:12:22
4
00:12:26
Pues efectivamente solo me ha sacado la que es mayor de edad de las dos
00:12:33
Este mismo
00:13:00
No, no, no, esta es la interrogación
00:13:01
que ya se asume que va a ser un string
00:13:08
hay que poner la interrogación
00:13:10
hay que ponerla entre comillas y nada
00:13:11
Claro, aquí el string
00:13:12
ya marca que es un string
00:13:16
Vale
00:13:17
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 1
- Fecha:
- 19 de mayo de 2026 - 13:49
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 13′ 40″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 64.16 MBytes