20250516 IntrodBd - 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 a lo que íbamos.
00:00:00
Esto es una pequeña contestabilización solamente para que tengáis de dónde tirar
00:00:04
y porque haréis la aplicación desde cero vosotros, claro.
00:00:07
Todos sabéis lo que es una base de datos relacional, lógicamente.
00:00:12
Es una base de datos en la que la información está estructurada en tablas,
00:00:16
donde las tablas son colecciones de registros.
00:00:20
Y ya está, cada registro es, a su vez, un conjunto de campos,
00:00:22
donde cada campo es un dato
00:00:26
de ese registro
00:00:28
que representa
00:00:31
un objeto en realidad
00:00:31
es lo que representa un registro
00:00:33
y la tabla que representa en realidad
00:00:35
una clase
00:00:38
cuando nosotros trabajamos
00:00:39
con la clase coche
00:00:41
y luego tenemos un montón de objetos
00:00:44
coche, el SEAT, el Renault
00:00:46
pues lo que tenéis es una tabla
00:00:47
coche en la que hay un montón de registros
00:00:50
el SEAT, el Renault, el no sé cuántos
00:00:53
y no sé qué, ¿verdad?
00:00:55
¿Para dar la coche a la isla a propósito?
00:00:55
Sí, porque me parece que es la...
00:00:57
Sí, pues estaba en la mesa y ya estaba en la mesa.
00:00:59
Bueno, pues entonces,
00:01:02
eso es una base de datos relacional.
00:01:04
¿Vale? Así está estructurada
00:01:10
y ya está.
00:01:12
Entonces,
00:01:14
¿cómo estructurar los datos solamente así?
00:01:15
Se queda muy pobre, pues por eso se meten claves.
00:01:17
¿Vale? Claves primarias
00:01:19
que identifican de forma única
00:01:21
a cada registro, así la información es más manejable
00:01:22
y tiene una estructura un poquito más real
00:01:26
y luego como la información siempre está relacionada
00:01:29
un coche siempre pertenece a
00:01:32
una marca, la marca a su vez
00:01:34
puede pertenecer a un proveedor, lo que sea, pues por eso
00:01:38
desde cada registro podemos decir, oye y este registro
00:01:40
además tiene una información añadida que no la pongo
00:01:44
aquí porque es que me iría hasta el infinito con este
00:01:47
registro, no la pongo aquí, sino que salta aquí. Salta aquí, la añadida la tienes
00:01:50
aquí. Pues esto es lo que habéis estudiado y luego habéis hecho un lenguaje de consultas
00:01:56
para obtener la información que hay aquí, modificarla, etcétera, etcétera. Vale, pero
00:02:00
normalmente el SQL no se utiliza directamente desde un cliente de SQL en el que no hace
00:02:07
las consultas, un humano, porque entonces ese humano, pues ya con todos esos resultados,
00:02:13
tendría que manualmente
00:02:16
volcarlos a la aplicación
00:02:19
que fuera, etcétera
00:02:21
tiene sentido, lo natural es que la base de datos
00:02:22
acceda a una aplicación
00:02:25
nuestra aplicación de gestión, la que sea
00:02:27
pues esta pequeña
00:02:29
aplicación de gestión que hayáis vosotros
00:02:38
accederá, modificará
00:02:39
consultará lo que vosotros
00:02:42
decidáis
00:02:43
de esta base de datos que vosotros habéis
00:02:44
decidido, ¿vale? con dos, tres tablas
00:02:47
como mucho, relacionadas con claves
00:02:49
ajenas a ser posible, bueno, a ser posible y aunque no sea posible, ¿vale? Bueno, pues
00:02:51
entonces, la aplicación de gestión, ¿qué es? Pues una aplicación exactamente igual
00:02:57
que la que hemos hecho, una aplicación normalucha y corrientucha que tiene que, como todas las
00:03:02
aplicaciones, pues tendrá su modelo de datos con sus clases. ¿Qué va a ocurrir aquí
00:03:08
en particular? Pues que va a resultar, si esta aplicación está diseñada, va a resultar
00:03:14
que cada clase
00:03:21
cada clase
00:03:22
va a resultar
00:03:25
que tiene una tabla
00:03:28
equivalente
00:03:30
tiene sentido
00:03:33
si esta aplicación gestiona
00:03:35
coches, que otras cosas
00:03:37
habíamos hablado hace un rato
00:03:40
marcas
00:03:41
marco
00:03:43
que es la que une marcas con coches
00:03:45
bueno, concesionarios, por ejemplo
00:03:47
pues entonces
00:03:49
la aplicación que gestiona esto
00:03:51
tendrá una clase coches
00:03:54
donde las propiedades
00:03:56
serán los campos del coche
00:03:57
tendrá una clase
00:03:59
marca
00:04:01
donde cada propiedad
00:04:02
será cada uno de los campos de esa tabla
00:04:07
¿verdad?
00:04:10
pero no
00:04:10
en Java no tiene sentido que exista la tabla Marco
00:04:11
la relación de muchos a muchos
00:04:14
O sea, que decís una tabla que está hecha para hacer una relación de muchos a muchos, ¿no?
00:04:19
No, es de 1 a 1
00:04:24
O de 1 a 1, vale, de muchos a muchos o de 1 a 1
00:04:27
No, ahí no, porque la información se va a representar de otra manera
00:04:31
Ahora mismo vamos a imaginar, ahora mismo solamente, el escenario de que las claves
00:04:35
Sí, que las claves son de 1 a muchos
00:04:39
Vamos a poner el escenario de 1 a muchos ahora mismo
00:04:43
Un coche pertenece a una marca
00:04:46
Pero una marca
00:04:49
Tiene muchos coches
00:04:51
Entonces esta sería de uno a muchos
00:04:52
Justo
00:04:54
Aquí también sería de uno a muchos
00:04:56
Porque un concesionario tiene muchos coches
00:04:58
No sé cómo será vuestra tabla
00:05:01
Pero imagino que será así
00:05:02
Y un coche pertenece a un solo concesionario
00:05:03
Suponemos
00:05:06
Bueno pues entonces
00:05:07
Esto
00:05:08
Una vez que tengáis
00:05:10
Vuestras tablas decididas
00:05:12
porque lo primero
00:05:15
que uno modela cuando hace una aplicación
00:05:16
es esto
00:05:19
eso es lo primero, los datos
00:05:20
que estará normalmente en una base de datos
00:05:23
relacional, si está en una base de datos de otro tipo
00:05:25
pues lo modela como sea esta base de datos
00:05:27
pero esto es lo primero, el punto de partida
00:05:29
es esto, mis datos son estos
00:05:31
¿dónde van a estar guardados?
00:05:33
una base de datos, esta base de datos
00:05:34
¿cuál es su mejor diseño?
00:05:36
para guardar esta información de forma
00:05:39
consistente, coherente, manejable
00:05:40
escalable, de forma que si yo incorporo
00:05:43
un dato nuevo, no tenga que hacer
00:05:45
aquí una remodelación de todas las tablas
00:05:47
entonces lo primero es hacer un buen diseño
00:05:49
de la base de datos
00:05:52
y cuando ya esa base de datos
00:05:53
está, uno ya va
00:05:55
a la aplicación, la aplicación es la segundona
00:05:57
si no hay datos, la aplicación no
00:05:59
existe y tiene ningún sentido
00:06:01
bueno, pues en este caso, como he hecho una relación
00:06:03
de muchos a uno
00:06:05
aquí como lo ponéis, un coche
00:06:06
tiene una sola marca, lo ponéis así
00:06:09
o al revés
00:06:11
y un
00:06:12
y esto también así, ¿no?
00:06:14
Un coche, un concesionario
00:06:18
que tiene muchos coches.
00:06:20
Pues entonces, en una situación como esta, por ejemplo,
00:06:21
¿lo he puesto al revés?
00:06:24
No, creo que es el elemento.
00:06:25
Porque un coche puede estar en más de un concesionario.
00:06:27
Ah, bueno, vale, pero vamos a nosotros, ahora mismo,
00:06:29
como estamos con el ejemplo de uno a muchos,
00:06:31
vamos a suponer que un coche está en un concesionario
00:06:34
solamente, en uno solo.
00:06:35
Bueno, pues vosotros una vez que tenéis elegida
00:06:37
vuestra base de datos,
00:06:39
ahora ya hacéis el diseño de la aplicación
00:06:40
y claro, el diseño de la aplicación
00:06:44
siempre parte de primero
00:06:45
las clases, como siempre
00:06:48
lo que pasa es que ahora, en lugar de hacer las clases
00:06:49
como las hacíamos nosotros, que era pensando
00:06:52
directamente en la realidad
00:06:53
y en representarla, pues ahora
00:06:55
es que lo tenemos más fácil, porque ahora nuestras
00:06:57
clases van a mapear, tienen que mapear
00:06:59
directamente estas tablas
00:07:01
entonces eso, se puede
00:07:03
hacer a mano
00:07:05
o en función del framework
00:07:06
de acceso a base de datos que se utilice
00:07:09
que nosotros ahora en este trabajo no vamos a utilizar
00:07:11
lógicamente, pues
00:07:13
se te lo cuenta derecho
00:07:14
se te monta automáticamente
00:07:17
no, no, no
00:07:20
bueno, sí, se te puede
00:07:22
incluso montar si tú haces, bueno
00:07:23
digamos que todo esto es muy complejo
00:07:25
pero que se te
00:07:27
tú puedes
00:07:29
porque es verdad, tú puedes saber
00:07:31
tú puedes tener un escenario en el cual
00:07:33
tú has pensado primero tu modelo de clases
00:07:35
y luego dices, y ahora quiero una base de datos
00:07:37
que encaje con este modelo de clases
00:07:40
también lo puedes generar automáticamente
00:07:41
no tienes que...
00:07:44
todo esto es muy interesante
00:07:45
claro, pero cuando hablo de generar automática
00:07:48
y todo eso, siempre está
00:07:50
el humano por encima
00:07:51
que tiene que verificar que todo eso
00:07:53
tiene algún sentido
00:07:56
porque claro, las cosas que generan
00:07:57
los frameworks, luego hay que irlas cogiendo
00:08:00
un poquito con pinzas, luego estará el humano
00:08:02
por encima, o dentro de 4 o 5 años
00:08:04
el robocito
00:08:06
que lo haga mientras vosotros estáis en el sofá
00:08:08
esperemos que en lugar
00:08:11
de en paro, controlando el robocito
00:08:13
esperemos
00:08:15
eso dependerá de vosotros
00:08:16
de lo que os hayáis
00:08:19
adaptado al sistema
00:08:21
bueno, pues entonces
00:08:22
sí, de lo que el sistema
00:08:24
haya permitido que nos adaptemos
00:08:27
pero bueno, vuestra parte tenéis que interhacerla
00:08:29
esperemos que sea suficiente
00:08:31
vale, bueno, pues entonces en nuestro caso
00:08:33
hora en particular, la base de datos
00:08:35
es lo primero que haréis. Y ahora ya tenéis que
00:08:37
hacer las clases. Bueno, pues en este caso
00:08:39
habrá una clase coche.
00:08:40
La clase coche pues tendrá
00:08:43
todas las propiedades
00:08:45
que tiene
00:08:48
cada registro de coche. Tantas propiedades
00:08:50
como campos. Pero ¿qué ocurrirá?
00:08:53
Que uno de esos campos
00:08:55
resulta que es una clave
00:08:57
ajena. Entonces, ¿eso qué
00:08:59
significa? Que el coche
00:09:01
tiene una marca asociada
00:09:03
que tiene un montón de información. Luego esta propiedad en realidad
00:09:05
es una propiedad objeto, porque
00:09:09
a su vez tiene dentro un montón de información. Luego cada vez que
00:09:13
hay una clave ajena, la propiedad correspondiente dentro de la clase
00:09:17
coche será a su vez un objeto. Es decir, tendrá
00:09:21
las propiedades primitivas normales de aquí y luego tendrá
00:09:25
una propiedad marca.
00:09:28
y esta propiedad es la que representa
00:09:30
el hecho de que aquí hay un campo
00:09:36
que me conduce a un registro entero
00:09:39
con un montón de propiedades
00:09:42
y lo mismo pasará con concesionarios
00:09:44
habrá otra clave ajena por aquí
00:09:49
que lleve a concesionarios
00:09:51
entonces eso significará que el coche tiene dentro
00:09:53
algo que tiene un montón de información
00:09:57
luego tiene dentro un objeto
00:10:00
luego significará esto
00:10:02
vale, pues con estas
00:10:04
directrices, lo otro ya podéis hacer
00:10:08
diseñar vuestras clases
00:10:10
luego ya vendrá el problema
00:10:11
el siguiente problema
00:10:14
que es, vale, pero cuando yo hago, cuando vos hacéis una consulta
00:10:16
de SQL
00:10:18
vosotros sacáis directamente
00:10:18
aunque hagáis un inner join
00:10:21
hagáis una multita, hagáis lo que sea
00:10:24
lo que saquéis es una colección de campos
00:10:25
¿qué va a tocar hacer
00:10:27
luego por código?
00:10:30
pues de esa colección de campos
00:10:31
que habéis obtenido con el SQL
00:10:33
separarlos, los que sean
00:10:35
de marca, construir un objeto
00:10:37
con ellos e instanciarlo
00:10:39
para meterlo a la propiedad de coche
00:10:41
los que sean de concesionario
00:10:42
extraerlos
00:10:44
e instanciar con ellos un objeto concesionario
00:10:47
para meterlo a la propiedad de coche
00:10:49
el resto de campos ya los metéis aquí
00:10:51
con eso ya se puede instanciar un coche, etc.
00:10:53
entonces todo eso es
00:10:56
trabajoso, porque tú tienes
00:10:57
simplemente unos datos ahí que has sacado
00:11:00
una consulta, un montón
00:11:01
y con ellos tienes que ir instanciando objetos
00:11:02
para reproducir ya tu objeto
00:11:06
coche, ¿vale?
00:11:07
Y todo esto ya casi lo hice a principio de curso
00:11:09
cuando estaba haciendo el videojuego
00:11:11
y todo este tipo de cosas
00:11:13
lo que no hice es la base de datos como tal, pero me la hice a mano
00:11:15
Pues más fácil
00:11:17
Vale, pues entonces así es como se trabaja
00:11:19
Entonces esto, si uno lo hace
00:11:21
a mano, que es como nosotros lo vamos a hacer ahora
00:11:23
tiene el máximo control
00:11:25
de la aplicación, entonces esa va a ser nuestra forma
00:11:27
a hacerlo ahora, que es con la capa base
00:11:29
que es la que se llama JDBC
00:11:31
de la que ahora vemos rápidamente
00:11:33
las directrices para que busquéis a través de ella
00:11:35
y ya está, JDBC, vale
00:11:37
pero claro, si uno tuviera que hacer una aplicación enorme
00:11:39
gigante, siempre así a mano
00:11:41
con JDBC
00:11:43
pues perdería una cantidad de tiempo
00:11:44
entonces por eso es por lo que se van poniendo capas adicionales por encima
00:11:47
es decir, frameworks o clases
00:11:49
que uno importa
00:11:52
que te esconden esta complejidad
00:11:53
tú configuras
00:11:56
ciertas cosas de ellas, configuras
00:11:58
que no es sencillo configurarlas
00:12:00
y luego le dices, oye, sácame un coche
00:12:02
de la base de datos
00:12:04
y esa herramienta que tú has configurado
00:12:05
es la que te hace el SQL
00:12:08
tú ni ves SQL ni nada, el SQL no lo ves jamás
00:12:10
sácame un coche
00:12:12
entonces, esa herramienta
00:12:14
por dentro te hace
00:12:16
el SQL, te saca
00:12:18
todo lo que haga falta, te construye
00:12:20
los objetos, te los instancia
00:12:22
y te da el objeto coche ya hecho, tú le dices
00:12:24
oye, herramienta, dame un coche
00:12:26
con el ID tal
00:12:28
y te da el coche, que tiene dentro la marca
00:12:29
tiene dentro todo
00:12:31
pero primero, configurarla
00:12:32
para que realmente entienda
00:12:35
donde está cada parte
00:12:37
del coche, no es fácil
00:12:39
hay que hacerlo bien
00:12:41
y segundo, pierdes un poco el control
00:12:42
porque si tú haces el SQL directamente
00:12:45
a lo mejor consigues
00:12:47
una aplicación de mejor rendimiento
00:12:49
porque la base tradicional es
00:12:51
estructurar la información de manera muy
00:12:53
gráfica y todo muy bonito
00:12:55
pero estas son pesadísimas
00:12:56
un sistema gestor de base de datos
00:12:59
es súper pesado
00:13:01
muchas veces es el cuello de botella de una aplicación
00:13:02
eso, el sistema gestor de bases de datos
00:13:05
por eso es por lo que se han incorporado
00:13:07
bases de datos no relacionales
00:13:09
al mercado
00:13:11
para intentar que dejen de ser el cuello de botella
00:13:12
de las aplicaciones
00:13:15
pero claro, como esto está tan desarrollado
00:13:16
está ya tan currado, tan trabajado
00:13:18
pues siguen siendo todavía
00:13:20
normalmente
00:13:22
las que se usan en la mayoría de aplicaciones
00:13:24
pero son muy pesadas
00:13:25
aunque sean los que más se usan
00:13:29
son muy pesadas
00:13:31
entonces, ¿qué es lo que estaba diciendo?
00:13:32
que usar esa herramienta, ese framework que digo
00:13:35
aparte de la dificultad de configurarlo
00:13:37
pierdes el control de la aplicación
00:13:39
porque ella hace el SQL que Dios le da a entender
00:13:41
tú no controlas como lo está haciendo
00:13:43
y no digo puede ralentizar
00:13:45
no, ralentizan
00:13:47
ralentizan una barbaridad la aplicación
00:13:49
pero bueno, una aplicación comercial normal
00:13:51
pues hombre
00:13:53
tampoco
00:13:54
eso tiene por qué ser un problema
00:13:55
entre esperar un milisegundo
00:13:58
a que te den la respuesta de tu venta
00:14:00
y esperar un milisegundo y medio
00:14:02
pues bueno, tampoco es crítico
00:14:03
¿vale?
00:14:05
depende del contexto
00:14:06
si es una aplicación pequeña, pues sí
00:14:11
¿vale? por ejemplo, vosotros no os acordaréis
00:14:13
pero el chico que vino aquí
00:14:16
a principio de curso y os contó un montón
00:14:18
de cosas de lo que hacía, en algún momento mencionó
00:14:20
y dijo, en esta parte de la aplicación
00:14:22
estoy haciendo directamente
00:14:24
JDBC, pues se refería a esto
00:14:26
que estaba haciendo directamente desde la aplicación
00:14:27
las consultas SQL, la reconstrucción
00:14:30
de los objetos y todo eso
00:14:32
pero no es lo habitual
00:14:33
lo habitual es que una aplicación grande
00:14:36
se haga con otra capa por encima
00:14:37
que es esa herramienta que os digo
00:14:39
que es en Java
00:14:41
y en muchos otros lenguajes
00:14:44
es esta, es la que se usa prácticamente siempre
00:14:45
por si os suena de nombre
00:14:48
y luego normalmente encima de esta capa
00:14:51
Como esta es tan pesada de configurar, pues desde hace ya bastante tiempo se le ha puesto otra capa por encima, que es la capa que se llama Sprint.
00:14:53
Sprint es una bolsa enorme donde cabe de todo, una bolsa enorme que vale para todo, pero parte de para lo que vale es para ponerse por encima de Ibernate en teoría para facilitarnos las cosas.
00:15:07
pero de nuevo sprint es relativamente
00:15:20
complicado de configurar, conclusión
00:15:23
uno puede llegar a una situación en la cual
00:15:25
hacer un simple select
00:15:27
para sacar un coche
00:15:29
que en JDBC
00:15:30
son cuatro líneas de código
00:15:32
pues se puede
00:15:34
si tú le pones toda la arquitectura
00:15:37
de JDBC que es hacerlo a mano
00:15:39
por encima de esto, por encima de esto
00:15:41
le pones toda la arquitectura
00:15:43
tienes una aplicación de mil
00:15:44
dos mil clases
00:15:47
que están ocultando
00:15:48
en realidad un único select
00:15:50
es lo único que están ocultando
00:15:52
entonces claro, si la aplicación te hace un select
00:15:53
pues no pones todas estas capas
00:15:55
pero si la aplicación es una aplicación de gestión
00:15:57
que te hace un montón de cosas con la base de datos
00:16:00
y encima tu intención es que vaya escalando
00:16:02
y cada vez haga más cosas
00:16:04
pues entonces sí que montas
00:16:06
esta arquitectura desde el principio
00:16:08
porque sí que te va a facilitar el incorporar
00:16:09
nuevas funcionalidades y todo eso
00:16:12
porque una vez que la tienes configurada
00:16:13
ya está, el meterle funcionalidades nuevas es inmediato
00:16:15
el problema es la configuración de partida
00:16:18
y tener toda la arquitectura que te funcione
00:16:20
y ahí
00:16:22
ahora mismo, chat GPT no es de mucha ayuda
00:16:23
¿vale? porque chat GPT
00:16:26
pues bueno, no
00:16:29
casa las versiones
00:16:30
porque aquí sobre todo es, si pongo esta versión
00:16:32
esta no funciona, tengo que buscar otra
00:16:34
entonces chat GPT es de ayuda
00:16:35
para saber por dónde van ciertos tiros
00:16:38
pero en estas cosas no es de mucha ayuda
00:16:40
¿vale? entonces
00:16:42
no vamos a montar la arquitectura
00:16:44
nosotros ahora, la montaremos el año que viene
00:16:45
simplemente en vuestro
00:16:48
trabajito de ahora vais a hacer
00:16:50
esto que os he dicho a mano
00:16:52
y hacerlo a mano
00:16:53
significa hacerlo con esto
00:16:55
de aquí, ¿vale?
00:16:58
entonces palabra clave de la que tenéis que tirar
00:16:59
para hacer vuestro trabajito
00:17:01
bueno, está claro hacer la base de datos
00:17:03
la aplicación Java con el modelo de datos
00:17:05
pues
00:17:07
ya sabéis las directrices para hacerlas
00:17:08
si hay claves ajenas
00:17:12
bueno
00:17:13
las directrices apenas hemos dado
00:17:15
porque hemos dado en la clase coche
00:17:17
pero que pasaría en la clase
00:17:19
marcas por ejemplo
00:17:21
la clase marca
00:17:23
que está en el extremo 1
00:17:25
la clase marca pues tendría
00:17:27
todas las propiedades
00:17:30
de aquí y ya está
00:17:32
y no tiene más todas sus propiedades
00:17:33
pero que le pasa a marcas
00:17:35
que como tiene una clave ajena
00:17:37
marcas en realidad
00:17:39
tiene un montón de coches dentro
00:17:41
aquí esa información no está
00:17:43
aquí solamente están las propiedades de la marca
00:17:45
pero nosotros sabemos
00:17:47
porque tenemos la visión de toda la base de datos
00:17:49
nosotros sabemos que hay un montón
00:17:51
de coches, un montón que están tirando
00:17:53
de ella, hay un montón
00:17:55
entonces, ¿eso cómo se debería reflejar
00:17:57
en la base de datos?
00:18:00
pues como una colección
00:18:02
efectivamente, como una colección
00:18:03
de coches
00:18:05
Entonces, cuando hay una clave ajena
00:18:06
Si en coche
00:18:14
Hay un objeto marca
00:18:15
Y es una clave de uno a muchos
00:18:17
En marca habrá una colección de coches
00:18:21
En una clave de uno a muchos
00:18:23
¿Vale?
00:18:24
Otra cosa es que nos interese rellenarlos
00:18:28
A lo mejor queremos
00:18:30
Obtenme los datos de la marca
00:18:32
Pero no nos interesan los coches
00:18:36
Pues hacemos simplemente el select
00:18:37
de los datos y rellenamos los campos de arriba
00:18:39
y este no le rellenamos
00:18:42
no tenemos por qué
00:18:44
porque para rellenar este
00:18:45
hay que seguir anidándosele aquí
00:18:47
hacer las subconsultas que sean
00:18:49
para sacar todos los coches
00:18:52
que llevan a la marca
00:18:53
de la que yo estoy haciendo sele
00:18:55
de irlo rellenando aquí
00:18:57
entonces por ejemplo
00:18:58
las herramientas esas que os digo
00:19:00
si yo le digo sacame una marca
00:19:02
solo te hacen las subconsultas
00:19:05
de la tabla de la que tira
00:19:07
para además rellenar los coches
00:19:09
si ven
00:19:11
que tú vas a usar ese dato
00:19:13
si no vas a usar ese dato
00:19:14
porque solamente vas a usar estos de arriba
00:19:17
esta no la rellena
00:19:19
solo la rellena si tú lo vas a usar
00:19:20
entonces, esos son los tipos de cosas que hay que configurar
00:19:22
etcétera
00:19:25
entonces, aunque el modelo de datos real
00:19:26
sea este
00:19:29
luego cuando vosotros hagáis las funcionalidades
00:19:30
de recupera
00:19:32
la marca que tiene más coches
00:19:34
ahí sí que
00:19:37
os rellenaríais esto, porque luego haríais el máximo
00:19:38
de la que tiene
00:19:41
la lista esta más larga
00:19:42
o recupérame las marcas para enseñarme
00:19:44
cuáles son, pues ahí no
00:19:47
os recuperaríais esto, porque esta información no interesa
00:19:49
y es un rollo
00:19:51
¿vale? haríais el select de los datos
00:19:52
los pondríais aquí y ya está
00:19:55
y nos recorreríais las marcas y se acabó, este link no os hace
00:19:56
falta para nada
00:19:59
lo único que digo es que
00:20:00
que existan aquí estas propiedades
00:20:02
representa esta clave
00:20:04
ajenas, lo que la representa. Y lo que decías tú, cuando hay una clave de uno a uno o de
00:20:07
muchos a muchos. Una clave de uno a uno o de muchos a muchos se hace con una tabla adicional.
00:20:13
Y esa tabla, efectivamente, no es una entidad propia. Por ejemplo, esta, imaginaos que esta
00:20:19
la cambiamos de muchos a muchos. Entonces, ahora ya necesitamos otra tabla, coche, concesionario,
00:20:26
lo que sea
00:20:34
necesitamos otra tabla
00:20:34
que representa
00:20:38
que un coche puede pertenecer a muchos
00:20:40
concesionarios y que un concesionario
00:20:43
puede tener muchos coches
00:20:45
o algo así
00:20:47
¿vale?
00:20:47
entonces
00:20:54
ese hecho
00:20:55
de que un coche
00:20:57
puede tener muchos concesionarios y al revés
00:20:59
ese hecho
00:21:00
en las clases es mucho más fácil
00:21:04
no tenemos que hacer efectivamente
00:21:07
una clase para esta
00:21:09
no hay que hacerlo
00:21:11
simplemente eso como se representa
00:21:12
pues
00:21:15
si este es el concesionario
00:21:17
claro, se pone una lista en ambos
00:21:21
y este es el coche
00:21:24
pues este tendrá
00:21:26
una lista de concesionarios
00:21:28
y este tendrá
00:21:30
una lista de coches
00:21:32
ah, porque eso es de muchos a muchos
00:21:33
Claro, porque es de muchos a muchos.
00:21:36
¿Qué es de uno a uno?
00:21:38
Un objeto aquí y un objeto aquí.
00:21:39
Y ya está.
00:21:41
Y se acabó.
00:21:42
Más los guetes y los setes, tu stream, lo que haga falta.
00:21:44
Entonces, hacer las clases que representan eso es fácil.
00:21:48
¿Vale?
00:21:53
Luego ya, uno ya hace las funcionalidades que le toca hacer.
00:21:55
Que las que seleccionéis.
00:21:59
Pues, mostrar la película que más se ha visto.
00:22:01
las tres, cuatro
00:22:04
digamos tres, cuatro funcionalidades
00:22:07
de centillas, ¿vale?
00:22:09
si haces 20.000, pues 20.000
00:22:10
¿eh?
00:22:12
pues desarrollalas
00:22:16
así no te aburres
00:22:17
en casa
00:22:19
y no juegas tanto a videojuegos
00:22:20
¿no? ¿te puedes hacer esto?
00:22:22
¿qué tiene malo?
00:22:24
bueno, nada, pero todo el rato
00:22:26
o sea, hacer algo todo el rato
00:22:27
si tiene algo de malo
00:22:29
menos 2000, eso es estupendo
00:22:31
Vale, entonces vosotros ahora ya
00:22:33
Seleccionáis las funcionalidades que queráis hacer
00:22:38
¿Vale?
00:22:40
Y esas funcionalidades
00:22:41
Pues por ejemplo, las podéis recoger
00:22:43
En una clase
00:22:46
En los métodos correspondientes
00:22:49
Para que luego ya
00:22:51
Vuestra interfaz gráfica
00:22:53
Los llame cuando le hagan falta
00:22:54
Entonces podéis hacer una clase
00:22:56
Pues de como la queráis llamar
00:22:58
Tienen un
00:23:00
Estas clases tienen un nombre específico, pero bueno, dentro de una arquitectura más completa, que ya veremos el año que viene, ahora mismo la podéis llamar como queráis, funcionalidades o como sea.
00:23:02
Y ahora, esta clase, pues tendrá los métodos, vamos a ponerlos, por ejemplo, estáticos, para que se llenen fácilmente.
00:23:13
Y aquí lo que seleccionéis, pues por ejemplo aquí, consultar concesionario con más coches.
00:23:22
entonces, este método
00:23:28
el concesionario con más coches
00:23:30
tendría como valor de retorno
00:23:32
un objeto concesionario
00:23:34
el nombre que fuera
00:23:36
y este en particular no tendría datos
00:23:39
de entrada, este método
00:23:42
se devolvería al concesionario con más coches
00:23:44
lo que sea
00:23:46
por ejemplo, recuperar
00:23:46
los datos de un coche, pues ese método
00:23:50
se le pasaría la clave primaria
00:23:52
lo que hayáis seleccionado para el coche
00:23:55
y te devuelve un objeto coche
00:23:56
con todos sus datos rellenos
00:23:57
pues lo que vosotros seleccionéis
00:24:00
mostrar el concesionario
00:24:02
los concesionarios en los que puedo comprar un coche
00:24:06
pues entonces ese método devolvería
00:24:08
una lista
00:24:10
de objetos concesionario
00:24:13
y se le pasaría un ID del coche
00:24:14
entonces eso es, coges el coche
00:24:15
si has mapeado ya la lista
00:24:18
de su propiedad lista, la devuelves
00:24:20
y ya está, lo que seleccionéis
00:24:22
más o menos
00:24:24
¿Vale? Bueno, pues el asunto es que una vez ya seleccionado las funcionalidades que vais a hacer, ahora ya el código de dentro, ese ya sí que sí, tiene que hacer algo para ejecutar el SQL con la base de datos.
00:24:25
Ahora ya sí que llegamos a, vale, ¿y cómo hago yo una consulta SQL desde Java? Ahora ya sí que sí hay que hacer una consulta SQL desde Java.
00:24:41
Vale, pues estamos ya en el método que sea y este método tiene que entenderse con la base de datos para ejecutar SQL y en el caso de que sea una consulta, recoger los resultados, porque si es un insert, un delete, no hay nada que recoger, pero si es una consulta, pues además tiene que recoger.
00:24:51
ya llegamos al punto en el que hay que ejecutar SQL
00:25:21
vale, pues aquí tenemos
00:25:23
el problema
00:25:25
de que esto es Java
00:25:26
y esto es la base de datos que sea
00:25:28
Oracle
00:25:31
MySQL
00:25:33
SQLite, Postgre, la que sea
00:25:34
¿vale? podéis seleccionar
00:25:37
la base de datos que queráis
00:25:39
en realidad la forma de trabajar es
00:25:40
igual con todas
00:25:43
¿y si lo ponemos en la relación?
00:25:44
no, no, no
00:25:46
No, con las relacionales no.
00:25:47
¿Vale?
00:25:50
Con las relacionales no.
00:25:52
Estamos, nosotros se supone que vamos a hacer el trabajo con las relacionales.
00:25:54
¿Vale?
00:25:57
Bueno, seleccionéis la que os dé la gana.
00:25:57
¿Vale?
00:26:00
Entonces, ¿cuál es el problema?
00:26:00
Seleccionéis la que seleccionéis.
00:26:02
Esto habla chino y esto habla japonés, con lo cual no se parece absolutamente nada.
00:26:04
¿Verdad que no?
00:26:10
¿A que no se parecen en agua?
00:26:11
A que no se parecen en agua.
00:26:12
¿Por qué?
00:26:13
Porque en el agua hay calles criminales.
00:26:13
ya, pero un chino y un japonés
00:26:15
no se entienden entre ellos ni de lejos
00:26:19
claro
00:26:21
por ejemplo
00:26:22
como un andaluz y un gallego
00:26:25
tampoco se entienden
00:26:27
pues, entonces, ¿qué necesitamos?
00:26:28
necesitamos un traductor
00:26:32
no hay más remedio
00:26:33
hace falta un traductor
00:26:35
entonces el traductor
00:26:37
tiene que saber Java
00:26:39
y tiene que saber
00:26:41
la arquitectura interna
00:26:43
con la que está desarrollado esto
00:26:45
entonces, ese traductor
00:26:46
ese traductor
00:26:50
son clases de Java
00:26:52
son clases de Java
00:26:54
que son capaces, que están construidas
00:26:55
para saber hablar el idioma Java
00:26:57
y este otro, entonces esas clases de Java
00:26:59
no están en la máquina virtual de Java
00:27:01
pues la máquina virtual de Java no puede tener traductor
00:27:03
en falta de la base de datos del mundo
00:27:05
la máquina virtual de Java no tiene nada de eso
00:27:06
entonces
00:27:09
Entonces, para la base de datos que uno haya seleccionado, sea la que sea, tiene que buscar las clases y esas clases estarán como siempre en un punto HAB, tiene que buscar las clases que son capaces de hacer la traducción.
00:27:10
Esas clases se llaman el driver, para más en datos, el driver JDBC, porque esto que estamos nosotros hablando ahora, entra dentro de la arquitectura JDBC, que es Java Database Connectivity.
00:27:25
conectividad pues hay que buscar el driver jdbc el driver jdbc que es
00:27:39
un jar que tiene las clases que son capaces de hacer la traducción bueno pues entonces
00:27:49
como incorporamos nosotros clases nuevas a nuestra aplicación pues lo hemos hecho a veces con él
00:27:54
build path claspada
00:28:01
de external hard etc
00:28:04
estas son las cosas que tienes que refrescar o mirar
00:28:05
o preguntarle a alguien
00:28:08
que lo sepa
00:28:10
por ejemplo
00:28:12
o quien sea
00:28:15
bueno pues una vez que esas clases
00:28:15
están ya incorporadas al
00:28:18
claspad de la aplicación porque las habéis
00:28:20
agregado con ad external hard etc
00:28:22
que esas las forman
00:28:24
chapuzas
00:28:26
la forma buena es con maven con un gestor de dependencia
00:28:27
pero esa la dejamos para el año que viene
00:28:30
vamos a quedarnos con la chapuza
00:28:32
que es incorporar el hard directamente
00:28:33
¿por qué digo que chapuza?
00:28:36
porque tú llevas tu aplicación a tu ordenador
00:28:38
y la has cagado
00:28:40
porque no tira
00:28:43
o te llevas el hard a la misma ubicación
00:28:44
a ese nuevo ordenador
00:28:47
o esa aplicación te va a decir
00:28:48
oye, estás tirando de un hard que yo aquí no lo tengo
00:28:51
entonces es la forma chapuza
00:28:53
pero bueno
00:28:55
hay una forma menos chapuza
00:28:55
que es, en lugar de agregarlo
00:28:58
como addExternalHard y que el hard
00:29:00
esté en tu sistema de archivos,
00:29:02
que el hard esté dentro de tu proyecto,
00:29:04
dentro, y lo agregas
00:29:07
como addHards. Entonces, él lo agrega
00:29:08
como ruta relativa. Entonces,
00:29:10
tú mueves la aplicación enterita con el hard dentro
00:29:12
a otro ordenador. Como está agregado
00:29:14
como ruta relativa, no hay ningún problema.
00:29:16
Pero la aplicación
00:29:19
va engordando, va engordando, va engordando, va engordando,
00:29:20
porque si le metes todo el hard dentro...
00:29:22
Bueno, hay otra
00:29:28
arquitectura para hacerlo, en la que
00:29:30
no lo llevas dentro
00:29:31
sí, pero está automatizado
00:29:32
entonces al estar todo automatizado
00:29:37
tú le dices, necesito este
00:29:39
hack, es lo que dices a Maven
00:29:42
a Gravel, a esos sistemas
00:29:43
y lo único que le dices es, esta aplicación
00:29:44
necesita este hack
00:29:47
y la aplicación cuando arranca
00:29:48
sea en el equipo que sea
00:29:51
te hace toda la gestión
00:29:52
eso si hace falta internet para que la aplicación arranque
00:29:54
te lo descarga, te lo pone en un repositorio interno
00:29:57
que tú no sabes ni dónde está, ni te importa
00:29:59
y trabaja con él, entonces es transparente para ti
00:30:01
lo único que necesitas es que haya internet
00:30:03
cuando arrancas la aplicación, es la manera
00:30:05
en la que se suele hacer, pero la primera
00:30:07
vez que la arrancas, porque una vez que ya te lo
00:30:09
ha descargado un repositorio interno, las siguientes veces
00:30:11
bueno, pues
00:30:13
nosotros lo vamos a hacer así
00:30:15
buscáis el driver
00:30:16
correspondiente a la base de datos que sea
00:30:19
el driver JDBC y lo importáis
00:30:21
bueno, una vez que esas clases ya están
00:30:23
ya podemos desde
00:30:25
aquí usarlas para ejecutar el SQL
00:30:27
entonces aquí se podrían haber hecho las cosas
00:30:29
bien o mal
00:30:33
pero afortunadamente desde hace ya
00:30:33
bastante tiempo
00:30:36
desde que, no desde los comienzos de Java
00:30:37
sino desde que se dieron cuenta de que
00:30:41
esto va creciendo, creciendo, creciendo
00:30:42
y como no nos organizamos va a ser un pifoste
00:30:44
pues desde hace ya bastante tiempo
00:30:46
dijeron, vamos a ver
00:30:48
si todo el mundo va a hacer
00:30:49
accesos a bases de datos
00:30:52
aunque con diferentes
00:30:55
hard, vamos a unificar
00:30:57
la forma de hacerlo, aunque
00:30:58
tengan que usar hard distintos
00:31:00
vamos a hacer una cosa
00:31:02
vamos a meter en nuestra
00:31:04
máquina virtual, en la JRE
00:31:06
que es la que tienen todas las aplicaciones
00:31:09
todas las aplicaciones
00:31:11
tienen la JRE con clases dentro
00:31:12
pues vamos a meter
00:31:15
unas clases vacías
00:31:16
que es una, o sea con métodos
00:31:18
vacíos, que es una clase
00:31:21
con métodos vacíos, una interfaz
00:31:22
como bien sabéis
00:31:24
pues vamos a meter
00:31:25
yo que sé
00:31:28
pues por ejemplo
00:31:29
una clase que se llame
00:31:32
driver manager
00:31:34
y que esta clase te meta
00:31:36
métodos vacíos del tipo
00:31:41
crea conexión
00:31:43
no pongo el nombre del método
00:31:45
ejecuta sentencia
00:31:50
entonces
00:31:52
vacíos, entonces
00:31:55
tu aplicación que va a hacer
00:31:58
tu aplicación va a llamar a estos
00:31:59
métodos, entonces todo el mundo
00:32:02
me da igual que esté usando
00:32:04
Oracle, MySQL, todo el mundo
00:32:05
hace la aplicación de la misma manera
00:32:08
que es llamando a los métodos
00:32:11
de la interfaz, que está en la máquina virtual
00:32:12
que es una especie de paraguas común
00:32:15
que usan todos, pero claro
00:32:16
estos métodos están vacíos
00:32:18
entonces
00:32:20
estos métodos
00:32:21
se llenan
00:32:24
automáticamente con el código
00:32:26
que trae este driver
00:32:28
claro, sin que hagamos nosotros nada
00:32:29
entonces cuando tú importas
00:32:32
el driver de una base de datos
00:32:34
automáticamente
00:32:36
esta, no es que se llenen
00:32:39
es que esta clase
00:32:40
trae las implementaciones de estas interfaces
00:32:42
entonces cada driver
00:32:45
trae las implementaciones
00:32:47
los implements
00:32:49
de estas que aquí están vacías
00:32:50
pero como bien sabéis por el tema de la herencia
00:32:52
uno en su aplicación llama
00:32:55
a los métodos de la interfaz
00:32:56
y automáticamente ¿qué es lo que se ejecuta?
00:32:58
lo que se ejecuta es la implementación
00:33:01
de abajo
00:33:03
bueno, pues entonces
00:33:03
tú importas el driver
00:33:05
y ya está, y estás importando
00:33:07
la implementación, pero tú llamas a los métodos
00:33:10
que al año que viene
00:33:12
tu aplicación cambia y has cambiado de base
00:33:13
de datos, lo único
00:33:16
que tienes que cambiar es el hard
00:33:18
solo cambias el hard, no tienes que cambiar nada más
00:33:19
porque la llamada a los métodos
00:33:21
todo es igual, gracias a que
00:33:23
está todo
00:33:25
oculto, envuelto
00:33:27
en que hay una interfaz
00:33:29
es una interfaz
00:33:31
o un conjunto de interfaces
00:33:33
es lo que se llama API
00:33:34
¿vale?
00:33:36
de Application Program Interface
00:33:38
esto se llama API
00:33:41
entonces ¿qué es un API?
00:33:46
un API es un conjunto de métodos
00:33:48
para hacer algo en concreto
00:33:51
a lo que tu aplicación llama
00:33:52
tu aplicación llama a una API para hacer cosas
00:33:54
pero las APIs
00:33:57
luego alguien las tiene que implementar
00:33:58
Bueno, pues en este caso la API JDBC, porque estas clases de aquí, estas interfaces se llaman la API JDBC, pues a la API JDBC que nosotros llamamos para crear conexión, ejecuta sentencia, etcétera, etcétera, esta API la rellena por dentro este driver.
00:34:00
simplemente por el hecho
00:34:19
que importemos
00:34:21
entonces ahora vuestra tarea
00:34:22
pues aparte de hacer la base de datos
00:34:25
mapear las clases, una vez
00:34:27
seleccionadas
00:34:29
las funcionalidades que queréis
00:34:30
pues ver
00:34:33
a qué métodos y cómo
00:34:35
tenéis que llamar de esta API
00:34:37
para
00:34:39
hacer las cosas, que os adelanto
00:34:40
que es siempre la misma arquitectura
00:34:43
crear conexión
00:34:45
Para crear conexión
00:34:47
Veréis que hay que dar
00:34:50
Pues la IP donde está mi base de datos
00:34:51
El puerto en el que escuche, etc.
00:34:53
Si la base de datos está en vuestro mismo equipo
00:34:55
Pues la IP será localhost
00:34:57
Vale
00:34:59
Crear conexión
00:35:00
Ejecutar la sentencia SQL que sea
00:35:02
Para lo cual habrá que llamar a otro método
00:35:05
De esta API
00:35:07
Y luego cerrar conexión
00:35:08
Ejecutar la sentencia
00:35:10
Si ha sido un insert, un delete o lo que sea
00:35:12
Pues ya está
00:35:14
Si ha sido un seller, pues te devolverá algo y dentro de ese algo tendréis que meteros para sacarlo y ya rellenar las propiedades de los objetos.
00:35:14
Y ya está.
00:35:24
Entonces tenéis que ver cuáles son los métodos de esta API para usarlos para crear la conexión dentro de cada funcionalidad,
00:35:26
ejecutar la sentencia que toque, cerrar conexión y ya está.
00:35:36
y una vez ejecutada la sentencia, pues los datos manejarlos
00:35:41
claro, manejarlos, pero eso ya es hard
00:35:44
¿no se deja la conexión abierta hasta que vayas a terminar
00:35:45
y trabajar?
00:35:47
a ver, no es lo recomendable
00:35:50
lo normal, como
00:35:52
estas son
00:35:53
son funcionalidades atómicas, digamos
00:35:55
tú cuando las usas, creas una conexión y ya está
00:35:57
se puede hacer a veces, una cosa que se llama
00:36:00
un pool de conexiones, que es tener varias abiertas
00:36:01
para cada método
00:36:04
te selecciona una y luego la suelta
00:36:05
pues un poco para optimizar
00:36:07
la rapidez de los
00:36:09
accesos, cuando se usa una herramienta de esas
00:36:11
ella ya se crea su propio pool
00:36:13
pero lo habitual es que
00:36:15
tú no la dejes abierta
00:36:17
porque eso
00:36:19
siempre puede tener efectos colaterales
00:36:20
para los commit, para todo eso
00:36:22
para los rollback
00:36:25
pues nada, esto es lo que tenéis que hacer
00:36:25
que guay
00:36:29
ya está
00:36:30
ya habéis pensado que vais a gestionar
00:36:31
uy 14
00:36:34
que suerte
00:36:37
dime
00:36:37
pues ya veréis que interesante es el año que viene
00:36:39
esto
00:36:44
divertidísimo
00:36:44
no, que sí, que sí
00:36:46
- 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:
- 9
- Fecha:
- 19 de mayo de 2025 - 13:32
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 36′ 52″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 1.28