20251211 BDR-SPRING-JDBC - 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 vamos a dar nuestro siguiente pasito en el tema de acceso a datos,
00:00:01
que es el que nos interesa a nosotros.
00:00:07
¿Verdad?
00:00:09
Pues mira, es de lo poco que te puede interesar en la vida.
00:00:15
¿Qué?
00:00:26
Joder, con el sprint de los cojones.
00:00:30
¿Qué?
00:00:32
vale, vamos a
00:00:32
que sí
00:00:35
me da lo mismo que esté grabando
00:00:36
me da igual
00:00:39
vale
00:00:40
pues vamos a ponerle una pequeña capita
00:00:42
¿vale?
00:00:45
os vais a cagar
00:00:46
¿queréis sprint?
00:00:48
os vais a cagar
00:00:50
os vais a cagar
00:00:51
¿vale?
00:00:54
pero vamos
00:00:55
por la pata abajo enterita
00:00:57
y os vais a arrepentir
00:00:59
¡Ay, sprint, sprint! ¿Pero qué crees que es sprint?
00:01:02
¿Alguien con solución a la vida?
00:01:05
Si tú lo quieres manejar bien y lo quieres
00:01:06
entender, te vas a cagar.
00:01:08
Hazme caso. Te vas a arrepentir.
00:01:11
Vale.
00:01:14
Bueno, pues vamos a
00:01:16
poner una primerita
00:01:17
capa de abstracción.
00:01:18
Bueno, a ver, es una broma, no pasa nada.
00:01:20
Es una broma todo.
00:01:24
No os asustéis.
00:01:25
No, no.
00:01:27
de verdad, confía en mí
00:01:27
no los pongo yo, los pone la vida
00:01:36
los pone el universo, los pone el entorno
00:01:38
claro
00:01:40
vale, pues entonces
00:01:41
en esta aplicación que hemos hecho
00:01:43
bueno, tenía un
00:01:46
serlet, pero eso ahora mismo es un detallito
00:01:48
para nosotros, vale, nos da igual
00:01:50
un main, un serlet, la capa
00:01:52
sobre todo que nos importaba
00:01:54
que es la nuestra
00:01:55
la de nuestro módulo es esta
00:01:57
la implementación del DAO
00:01:59
¿vale? entonces la implementación
00:02:01
del DAO es la que tiene el acceso
00:02:04
a datos
00:02:06
vale, pues nosotros
00:02:06
lo hemos hecho con
00:02:08
JDBC puro
00:02:11
que es lo que hay
00:02:13
lo que está ahí abajo
00:02:15
y no hay nada más que eso, otra cosa
00:02:17
repito, es lo que vayamos poniendo por encima
00:02:19
para encapsular o enmascarar esto
00:02:21
pero esto es lo que hay
00:02:23
entonces nosotros lo vemos
00:02:24
y bueno, vale, no es tan horrible
00:02:26
pero bueno, tiene un try
00:02:28
con recursos que es un poco
00:02:30
feo, tiene aquí
00:02:32
pues bueno, este en particular
00:02:35
que es hacer un insert no tiene tanto
00:02:37
pero este de aquí, por ejemplo
00:02:39
que era recuperar por ID
00:02:41
pues ya empieza, con esta
00:02:42
generación de vagos, pues ya
00:02:44
empieza a angustiarnos
00:02:46
porque yo tengo que devolver una venta
00:02:47
pero lo que saco
00:02:51
con el result set
00:02:53
pues lo que saco con el query
00:02:54
son valores sueltos
00:02:55
entonces tengo que preocuparme de instanciar
00:02:57
la venta, poner los valores sueltos
00:03:00
uff, que pereza
00:03:02
ver todo esto aquí, por no hablar de capturar
00:03:04
las excepciones
00:03:06
pues
00:03:07
si es fácil
00:03:10
bueno, os pondré
00:03:12
os dejaré para el fin de semana
00:03:14
esta tarde yo me daré a tiempo
00:03:16
pues algunos ejercicios para que
00:03:18
practiquéis con JDBC
00:03:20
que no son más que pues seguir haciendo
00:03:21
consultas, borrados, lo que fuera
00:03:23
para que practiquéis con el JDBC
00:03:25
que será pues poner las sentencias que sean
00:03:27
ejecutarlas y comprobar que funcionan
00:03:30
y ya
00:03:32
¿vale?
00:03:32
bueno, pues esto ya, entre capturar
00:03:35
excepciones, mapear
00:03:37
mis campitos sueltos
00:03:40
a un objeto
00:03:41
eh, abrir y, preocuparme
00:03:43
de abrir y cerrar las cosas
00:03:45
gracias al try con
00:03:47
recursos, pues no tengo que preocuparme de cerrarlas
00:03:49
pero bueno, tengo que preocuparme de poner un try
00:03:51
de este estilo, pues esto ya empiezan a quedar
00:03:53
códigos un poquito
00:03:55
feos y sobre todo que me obligan a
00:03:57
preocuparme de muchas cosas
00:03:59
bueno, pues hay una primera
00:04:00
y pequeñita, una primera y pequeñita
00:04:03
capa de abstracción que podemos
00:04:05
poner
00:04:07
que se llama Spring
00:04:08
JDBC, vale
00:04:11
porque Spring es mucho
00:04:13
pues hay una pequeñita capa de abstracción
00:04:14
que podemos poner
00:04:19
que viene dada a través de
00:04:20
esto
00:04:25
de una de las partes de Sprint
00:04:26
que encapsula el JDBC, una pequeñita
00:04:29
capa de abstracción, ligera
00:04:31
no tiene nada que ver con el líder de Sprint
00:04:32
no tiene que ver, forma parte del líder de Sprint
00:04:35
Sprint es una cosa muy gorda
00:04:37
y esta es una parte de Sprint
00:04:38
esta es una parte de Sprint
00:04:43
que me permite poner una capa
00:04:45
ligera
00:04:47
entonces, esta capa ligera
00:04:47
esta capa
00:04:50
ligerita
00:04:52
esta capa
00:04:53
ligera
00:04:57
no es la
00:04:57
capa gorda que también puede hacer el sprint
00:05:00
con el sprint data JPA no es la capa gorda
00:05:02
porque es que esa capa gorda, que es una capa
00:05:04
más gorda que viene por arriba
00:05:06
esa yo ahí ya sí que no veo SQL
00:05:07
ni veo nada, de repente todo aparece
00:05:10
y así no se hacen las cosas
00:05:12
porque luego no entiende uno lo que está pasando
00:05:14
por debajo, entonces sprint JPA
00:05:16
es una primera capa ligerita
00:05:18
que todavía te permite tener tu acceso al SQL.
00:05:20
Tú lo ves y tú haces las sentencias SQL que tú quieras.
00:05:24
Entonces, eso te permite optimizar el acceso a la base de datos
00:05:28
porque tú seleccionas los SQL que quieres.
00:05:32
No como con el sprint más la siguiente capa de sprint
00:05:35
que tú ahí no haces SQL para nada.
00:05:39
Entonces, si esta capa no me evita hacer SQL,
00:05:44
no me lo evita, ¿qué me evita?
00:05:48
Pues me evita
00:05:51
una de las cosas más importantes
00:05:52
y pesadas.
00:05:54
Lo que se llama
00:05:55
el mapeo.
00:05:58
Me evita lo que se llama
00:06:02
hacer el mapeo, que es
00:06:03
pasar de campos sueltos
00:06:05
que yo me he sacado de aquí,
00:06:08
pasar a mi objeto.
00:06:10
Me evita el mapeo, ¿vale?
00:06:12
A través de una cosa que ahora instanciamos
00:06:14
que se llama
00:06:16
todo lo que vamos a ver
00:06:17
lo vemos lógicamente
00:06:22
en un overview reducido
00:06:23
pero luego a partir de ahí
00:06:25
uno ya puede meterse
00:06:26
y ver el resto de métodos
00:06:27
de clases que tiene
00:06:28
pero bueno
00:06:29
eso ya son detalles
00:06:29
una vez que uno ha entendido
00:06:30
realmente de qué va el rollo
00:06:31
¿vale?
00:06:32
entonces me evita eso
00:06:34
por un lado
00:06:35
¿qué más nos evita?
00:06:36
manejar los try-catch
00:06:39
nos lo evita
00:06:40
¿vale?
00:06:41
nos
00:06:43
evita también
00:06:46
o nos enmascara de forma muy sencilla
00:06:49
la gestión de las transacciones
00:06:51
que eso es casi lo más importante
00:06:53
¿vale? porque cuando
00:06:54
trabajas con una base de datos
00:06:57
lo puedes hacer todo muy bien
00:06:58
no hay errores y todo funciona
00:07:01
pero si tú no has diseñado bien
00:07:03
la política de transacciones, lo que estás
00:07:05
haciendo puede ser una cagada, ¿no?
00:07:07
el típico ejemplo que os pondrán siempre
00:07:08
envases de datos de hacer una transferencia. Si tú el SQL, el insert, lo haces primero y luego
00:07:11
falla el delete de la otra, pues el dinero se queda en las dos cuentas. Con lo cual, para ti muy bien,
00:07:23
pero para el banco muy mal. O al contrario, si haces primero el delete, que ese funciona y luego
00:07:31
al hacer el insert en la otra cuenta
00:07:37
ese falla, pues va al banco
00:07:39
fenomenal, pero para ti una putada
00:07:41
entonces, esta es
00:07:43
una simplificación de una situación
00:07:45
en la que expresamos que hay
00:07:47
muchas cosas que se hacen en las bases
00:07:49
de datos, una sucesión de sentencias que queremos
00:07:51
que o se hagan todas
00:07:53
o no se haga ninguna
00:07:54
porque si se hacen a la mitad
00:07:56
todo ha funcionado, la aplicación
00:07:59
no da problemas, pero el estado final
00:08:01
en el que se queda la base de datos
00:08:03
no es el que queremos
00:08:05
entonces de transacciones
00:08:06
no trabajasteis
00:08:10
o el concepto de transacciones a mi pasa en bases de datos
00:08:12
no
00:08:14
no vale
00:08:15
tiene que ver con los coches
00:08:17
hombre pues si
00:08:18
tú compras un coche
00:08:21
vale pues entonces
00:08:23
normalmente si uno está
00:08:25
tocando con JDBC puro
00:08:28
con JDBC puro
00:08:30
uno tiene que preocuparse
00:08:31
de establecer
00:08:34
perfectamente se
00:08:35
con todas las transacciones, quiero estas sentencias
00:08:37
todas juntas, pues aquí
00:08:39
me las apaño para
00:08:41
ya mencionaremos como, me las
00:08:43
apaño para decir que
00:08:45
aquí inicio una transacción, aquí ya he terminado
00:08:47
y hago el commit, el commit y el
00:08:49
rollback, si que os suena
00:08:51
¿no? el año pasado
00:08:52
el commit y el rollback, si os suena
00:08:55
entonces si que os suena lo que es una transacción
00:08:56
ah y de que os suena
00:08:58
entonces
00:09:01
bueno
00:09:02
vale, bueno, en general
00:09:03
una transacción es
00:09:06
un conjunto de sentencias
00:09:09
SQL que queremos
00:09:11
que funcionen de tal manera
00:09:13
que o se ejecutan todas
00:09:14
o no se ejecuta ninguna
00:09:17
entonces, ¿qué política seguimos cuando queremos
00:09:18
hacer eso?
00:09:21
pues nosotros fijamos
00:09:23
que el
00:09:25
commit no se haga automáticamente
00:09:27
o sea, commit es lo que
00:09:29
la sentencia
00:09:31
que tú ejecutas para decir, oye, lo que acabo
00:09:33
de hacer en la base de datos, que se consolide,
00:09:35
que no se quede ahí
00:09:37
pendiente, que se consolide, ¿vale?
00:09:39
Entonces, cuando queremos una transacción,
00:09:41
nosotros decimos, oye, el commit
00:09:43
no me lo hagas automáticamente por sentencia.
00:09:45
No me lo hagas automáticamente.
00:09:48
Falso, commit, no quiero commit.
00:09:49
Ahora, me pongo a hacer sentencias todas las que hay en la
00:09:51
transacción. Si todo
00:09:53
ha ido bien y he llegado al final, porque
00:09:55
ninguna me ha dado excepción, entonces ahora
00:09:57
ya hago el commit.
00:09:59
que el commit significa
00:10:00
consolida este estado final
00:10:02
consolídalo, porque se han hecho
00:10:04
todas las sentencias una tras otra
00:10:06
ninguna ha generado excepción
00:10:08
luego todo está perfecto, ahora
00:10:09
consolido estas acciones
00:10:12
y eso significa hacer commit
00:10:14
vale, si en algún momento
00:10:16
de esa secuencia de sentencias
00:10:18
SQL, alguna ha fallado
00:10:20
pues entonces lo que queremos
00:10:22
es que todas las de arriba
00:10:24
se deshagan, se olviden
00:10:26
como si no se hubieran hecho
00:10:28
pues eso es hacer un rollback
00:10:29
un rollback es, fuera, todo lo que he hecho
00:10:31
hasta, de aquí hacia
00:10:34
arriba, hasta el último commit
00:10:36
que hice, deshazlo, como si no hubiera existido
00:10:38
¿vale? ese es el concepto de commit
00:10:40
y rollback, que lógicamente está relacionado
00:10:42
con las transacciones
00:10:44
bueno, pues todo esto venía a cuento
00:10:45
de que con mi JDBC puro
00:10:47
yo lo controlo todo, con lo cual estupendo
00:10:50
yo tengo un montón de sentencias SQL
00:10:52
que quiero que funcionen con una
00:10:54
transacción, pues antes de
00:10:56
ejecutar todas ellas, statement, ejecutive
00:10:58
date, bla, bla, bla, todas ellas
00:11:00
me pongo arriba, e
00:11:02
autocommit falso, autocommit falso
00:11:03
que se puede hacer con jdbc, muy sencillo
00:11:06
vale, y ahora ya cuando
00:11:08
ya han terminado todas al final, pongo
00:11:10
commit, vale
00:11:12
y en las que están entre medias, que
00:11:13
habrá trycatch, pues en los catch
00:11:16
es porque alguna genera excepción, ahí pongo
00:11:18
rollback, si he entrado en el catch
00:11:20
es porque alguna ha fallado, pues rollback no hay para
00:11:22
así lo haríamos con jdbc
00:11:24
entonces nos tenemos que preocupar
00:11:26
lógicamente pues de poner los commit
00:11:28
false, poner los commit
00:11:30
donde yo quiera, los rollback en los
00:11:32
cats, etcétera, bueno pues
00:11:34
esta capita ligera de
00:11:36
jdbc, además
00:11:38
de este mapeo, además de
00:11:40
cerrar los recursos
00:11:42
y hacer, y permitirme olvidarme
00:11:44
del trycat, dejar las excepciones
00:11:46
ahí me permite una gestión
00:11:48
de transacciones, vale
00:11:50
ya con un modelo más parecido al
00:11:52
Spring Data JPA que sería ya la capa
00:11:54
Gorda, la que no podemos
00:11:56
Arrancar desde el principio con esa capa, porque esa capa
00:11:58
Es pin, ya está
00:12:00
Ni puta idea de lo que ha pasado ahí, ni por qué
00:12:02
Y si cambia algo, ¿qué hago?
00:12:04
¿Vale?
00:12:07
Bueno, pues entonces, y aparte
00:12:08
Para
00:12:11
Volver a la reflexión
00:12:12
Que estabais dando en digitalización
00:12:14
Lo he dicho
00:12:16
200.000 millones de veces, pero lo vuelvo
00:12:18
A decir, os ha pedido la
00:12:20
Reflexión sobre qué valor
00:12:22
podéis aportar, ¿qué valor podéis aportar?
00:12:24
pues ¿qué valor podéis aportar?
00:12:26
capacidad de aprendizaje
00:12:28
esa
00:12:30
y eso se entrena pues
00:12:32
lucha, conociéndolo todo, luchando
00:12:34
con todo, resiliencia
00:12:36
famosa, ostras
00:12:38
en este examen de acceso a datos es que
00:12:40
no he hecho nada, no pasa
00:12:42
nada, en el siguiente
00:12:44
pues todas estas cosas que están aquí deslavazadas
00:12:45
me pongo y ahora ya si lo hago
00:12:48
bien, esa capacidad de resiliencia
00:12:50
de superación, ese es el valor
00:12:52
que podéis aportar, esa capacidad de aprendizaje
00:12:54
no tanto los contenidos
00:12:56
¿vale? pues eso
00:12:58
a sufrir
00:13:00
¿perdona?
00:13:01
vale
00:13:06
bueno, pues venga, vamos a poner
00:13:06
esa pequeña capita
00:13:09
de Spring JDBC
00:13:11
a ver, que esto es poco de escribir
00:13:13
y es que ayer por la tarde no me dio tiempo
00:13:16
a subiros chuleta, pero vamos a tener que escribir
00:13:17
poquito. Y no sé ni en qué proyecto
00:13:20
lo tengo ya.
00:13:22
Ya ni me acuerdo, pero no me dio tiempo a mirarlo.
00:13:24
No, no, no. Sobre este mismo, he dicho.
00:13:27
Vale, entonces voy a ver
00:13:30
un segundito.
00:13:31
Sí, vale, aquí lo tengo.
00:13:39
Vale, pues entonces, dime.
00:13:40
Bueno, pues
00:13:44
este es sobre el proyecto del otro día.
00:13:44
Como este proyecto ya tenemos un dado de implementación.
00:13:46
¿Vale? Pues sobre este
00:13:50
proyecto del otro día
00:13:52
con este de implementación
00:13:54
ahora vamos a ver
00:13:56
como lo haríamos
00:13:57
con JDBC
00:13:59
vale, vamos a ver
00:14:01
este para no tocarlo
00:14:06
hacéos una copia
00:14:08
de este en vuestro mismo workspace
00:14:10
os hacéis una copia
00:14:12
pues nada, copy
00:14:15
y os creará otro
00:14:16
vale, otro proyecto
00:14:18
igualito
00:14:20
En mi caso es este
00:14:21
Y así este no lo ensuciamos
00:14:25
Este es el que ya se ha quedado limpio
00:14:27
Funcionando perfecto del otro día
00:14:28
Spring JDBC
00:14:30
Que es una parte de Spring
00:14:34
Una capita ligera
00:14:37
Esto es una capa que pone Spring
00:14:38
Sobre JDBC
00:14:44
Para atrapar esto que digo
00:14:45
Para atrapar los trycon recursos
00:14:47
trapar todo eso, es una capa que pone encima
00:14:49
entonces si usamos Spring JDBC
00:14:51
esto se queda enmascarado
00:14:53
y tenemos
00:14:55
el trabajo más sencillo
00:14:56
bueno, pues entonces para no tocar este
00:14:58
que este es el que digo, que lo único que se
00:15:01
se había quedado pendiente en este es hacer los formularios
00:15:03
para desde ellos llamar al
00:15:05
find by id y al insert
00:15:06
porque los servicios y la
00:15:08
implementación estaba, solo faltaban los formularios
00:15:11
para llamar a esto, ¿vale?
00:15:13
todo lo demás estaba
00:15:14
y bueno, faltaban los formularios y faltaba
00:15:15
en este serlet, que sería una buena despedida
00:15:19
de los serlets para vosotros, a ver si realmente
00:15:21
lo habéis entendido, falta en el
00:15:23
serlet hacer las dos acciones
00:15:25
que faltaban, teníamos hecha la acción de
00:15:27
listar y la acción de eliminar
00:15:29
faltan la acción
00:15:31
de insertar, que sería llamar al
00:15:33
implementación de insertar
00:15:35
y la acción de encontrar por id
00:15:37
que sería llamar al servicio
00:15:39
de get por id y ya está
00:15:41
pues eso es lo que faltaría en este serlet
00:15:43
poner los dos acciones
00:15:45
que faltan
00:15:47
hasta aquí se llega desde los dos
00:15:48
formularios que podéis pedir a HGPT
00:15:52
y luego tunear con los nombrecitos
00:15:54
que os interese
00:15:56
y ya está, y desde aquí
00:15:57
llamar al servicio
00:16:00
correspondiente
00:16:02
es lo que faltaría para que quedara esta aplicación
00:16:02
completa, bueno
00:16:06
pues os habéis hecho ya una
00:16:07
copia limpia de este
00:16:10
vale, pues entonces, abrid
00:16:11
vuestro singleton
00:16:13
Vuestro singleton
00:16:15
De conexiones
00:16:19
Que era este, ¿verdad?
00:16:21
Este singleton
00:16:24
Era una clase que nos habíamos hecho
00:16:25
Para asegurarnos
00:16:28
De que objetos que vamos a usar
00:16:30
Para la conexión son únicos
00:16:33
En todo el ámbito de la aplicación
00:16:35
En todo el scope
00:16:37
De la aplicación que se llama
00:16:39
Porque como se usa mucho scope
00:16:40
Cuando uno
00:16:42
en el contexto nuestro
00:16:44
o ya tienes aplicaciones
00:16:47
con un montón de
00:16:49
scopes
00:16:50
se traduce como ámbito
00:16:52
en este contexto
00:16:54
entonces puede haber
00:16:56
en una aplicación en general
00:16:59
puede haber muchos ámbitos
00:17:00
donde se mueven los objetos
00:17:02
el otro día nos vimos ya por ejemplo en esa situación
00:17:04
teníamos el ámbito de Tomcat
00:17:06
y el ámbito de nuestra propia
00:17:09
aplicación
00:17:10
entonces ahí tuvimos el problema
00:17:11
de que el driver manager
00:17:14
que se arrancaba
00:17:15
en el ámbito de Tomcat
00:17:18
porque se arranca según la aplicación arranca
00:17:20
no encontraba el objeto
00:17:22
driver para comunicarse con MySQL
00:17:24
porque el objeto driver estaba en este otro
00:17:26
ámbito, en este otro scope
00:17:28
entonces por eso teníamos que hacer el class for main
00:17:29
para, vale, bueno pues
00:17:31
entonces, este es
00:17:34
nuestro singleton que es
00:17:36
el que tal y como lo hemos
00:17:37
programado garantiza que estos dos
00:17:40
objetos que tenéis vosotros, la conexión
00:17:42
simple y el
00:17:44
pool de conexiones, porque
00:17:46
lo hicimos de las dos maneras, son únicos
00:17:47
en la aplicación. Vale, pues
00:17:50
el objeto de Spring
00:17:52
JDBC base
00:17:53
con el que lo hacemos todo
00:17:55
es este, el JDBC
00:17:57
templata, ¿vale? Es este de aquí
00:18:02
y a través de este ejecutamos
00:18:04
los SQL y listo.
00:18:06
Este ya sí que necesita
00:18:08
una dependencia
00:18:09
que la podéis buscar
00:18:10
en el repositorio
00:18:12
o
00:18:15
es esta, tal cual
00:18:18
del framework de Spring
00:18:21
SpringJRG
00:18:23
vale
00:18:24
la versión que os salga en el repositorio
00:18:27
si lo buscáis por ahí o si no ponéis esto
00:18:31
y se acabó
00:18:33
esto es lo que quería haber subido
00:18:34
para que no tuvierais que copiar
00:18:40
pero no pasa
00:18:43
Pues desgraciadamente sí
00:18:43
Voy a abrir
00:18:52
Vale, pues entonces
00:18:53
Con esta dependencia de aquí
00:19:06
Lo habéis copiado
00:19:10
Si no la cogéis de Maben
00:19:12
Ponéis Spring JDBC y os va a salir esto
00:19:20
Pues con esta dependencia de aquí
00:19:23
ya
00:19:26
podemos
00:19:28
trabajar con este objeto.
00:19:30
Lo podréis importar
00:19:33
de la librería correspondiente
00:19:35
del framework de Spring.
00:19:37
Y ahora, vamos a hacer
00:19:39
el método para que esto realmente se convierta
00:19:41
en un singleton. Este objeto queremos
00:19:43
que sea único en toda la aplicación.
00:19:45
Bueno, vale,
00:19:47
pues este es nuestro get
00:19:51
para el singleton.
00:19:52
¿Vale?
00:19:56
Entonces
00:19:56
Copiáis y pegáis lo del properties de arriba
00:19:58
Lo copiáis y pegáis
00:20:01
Si es null hay que instanciarlo
00:20:03
Esto lo copiáis y pegáis de arriba
00:20:05
Y esto es
00:20:06
Lo que instancia el JDBC template
00:20:08
El JDBC template
00:20:12
Hay que
00:20:14
Instanciarlo de esta manera
00:20:16
¿De dónde lo copiamos?
00:20:18
De los métodos de arriba
00:20:19
O sea, arriba que tenéis
00:20:22
El get de la conexión
00:20:23
Y el get del pool
00:20:26
También tenéis esto
00:20:27
Porque sacábamos las propiedades de la base de datos
00:20:28
Del property
00:20:31
Entonces esto lo copiáis tal cual
00:20:31
Y esto es lo que instancia
00:20:35
El JDLC template
00:20:36
Esta de aquí
00:20:38
Esta sentencia de aquí
00:20:39
En realidad es la equivalente al class for name
00:20:46
Esta nos hace falta
00:20:49
Porque estamos viendo
00:20:53
El ejemplo de una aplicación web con tonka
00:20:55
¿Vale?
00:20:57
Si no, no nos haría falta
00:20:59
Si nos movemos a una aplicación de escritorio
00:21:00
Que nos moveremos ahora
00:21:04
Para ver lo de las transacciones más fácil
00:21:05
Pero las transacciones aquí en esta
00:21:07
En la aplicación web ya se valía demasiado
00:21:08
Si nos movemos a la aplicación de escritorio
00:21:10
Esto ya no lo vamos a poner
00:21:13
Tenemos solo un ámbito de objetos
00:21:14
Ya el driver manager va a encontrar su driver sin problema
00:21:16
Pero aquí sí porque es una aplicación web
00:21:19
Bueno, esto, este proyecto
00:21:21
Lo subiré también
00:21:23
Claro
00:21:26
Vale, pues con esto
00:21:26
Creamos el JDBC template
00:21:29
Que se asocia
00:21:31
A esta conexión
00:21:33
El JDBC template se puede asociar
00:21:34
A una conexión única o a un pool también
00:21:39
Si lo asocio a un pool
00:21:41
Es que esto me lo ahorro
00:21:43
Y pongo aquí el pool de arriba, junto pelota
00:21:44
¿Vale? Porque tengo ya un pool
00:21:46
También creado en esta conexión
00:21:49
Entonces el pool es un data source
00:21:50
Entonces tengo dos data sources posibles
00:21:53
Este que es el de una conexión única
00:21:55
Y el pool
00:21:57
Que es un datasource pool
00:21:59
Pues pongo aquí el que me dé la gana de los dos
00:22:00
¿Cómo se llama el método?
00:22:03
El
00:22:06
El get jdbc template
00:22:07
Es el que me va a permitir
00:22:09
Obtener este objeto
00:22:11
Ah
00:22:13
Vale, es el singleton
00:22:15
Igual que tengo el get conexión
00:22:20
Pues es el singleton de este
00:22:22
Si es null, me lo instancia
00:22:23
¿Vale?
00:22:26
Entonces bueno, estoy viendo un poco los detalles
00:22:28
este me lo instancia
00:22:30
asociado a una conexión
00:22:32
única, pero repito
00:22:34
también admite el constructor
00:22:36
un pool, lo que también es un data source
00:22:38
el pool, podría poner aquí el pool y ya está
00:22:40
y me lo instancia asociado a un pool
00:22:42
me da lo mismo, asociar
00:22:44
a una conexión única que a un pool de conexiones
00:22:46
¿vale? de hecho lo voy a poner aquí
00:22:48
si luego lo... copiamos
00:22:50
eso sí, nos llevabas copiándolo un rato
00:22:55
ay Rodrigo
00:22:57
te veo así que la...
00:23:05
Intentad meterlas cada vez que podéis, ¿eh?
00:23:07
Es que estaba tratando de entenderlo,
00:23:09
por eso lo he recopiado.
00:23:11
Vale, ahora mismo
00:23:18
lo único que tenéis que entender es
00:23:19
que el objeto este de Spring JDBC,
00:23:21
el JDBC template,
00:23:23
me va a facilitar
00:23:25
ejecutar las sentencias SQL
00:23:26
que yo quiera. Me lo va a facilitar.
00:23:28
¿Vale? Pero claro,
00:23:33
ese objeto JDBC template hay que asociarlo
00:23:34
a una conexión.
00:23:36
Una conexión única o un pool, me da igual,
00:23:38
Son las dos cosas que estamos manejando
00:23:40
Conexión única o pool
00:23:41
Si lo asocio a conexión única pongo esta cosa
00:23:42
Si lo asocio a un pool
00:23:45
Pues pongo aquí el pool de arriba
00:23:46
Que lo tengo ya instanciado
00:23:49
Y ya está
00:23:51
¿Vale? Que no es null
00:23:52
Pues devuelvo el que tenga
00:23:54
¿Vale?
00:23:55
Repito la tontería
00:24:17
¿Vale?
00:24:18
Que tal y como lo tenía antes
00:24:19
Efectivamente cada vez devolvía un objeto nuevo
00:24:20
Se iba multiplicando la aparición de objetos
00:24:23
lo que quiero es inicializar
00:24:25
el de arriba, en el resto lo tengo bien puesto
00:24:28
¿verdad? si, si, en el resto, si
00:24:29
vale, vale, aquí lo tenía muy mal
00:24:31
vale, entonces si es null
00:24:33
le doy valor
00:24:35
y si no es null no hace falta darle valor
00:24:36
y en ambos casos lo devuelvo
00:24:39
claro, lógicamente esto no servía
00:24:41
de singleton para nada
00:24:43
podía funcionar
00:24:45
igualmente pero con un montón de objetos
00:24:47
ahí en la memoria
00:24:49
vale, bueno pues ya este
00:24:50
objeto lo tenemos instanciado, ahora vamos
00:24:53
a usarlo. A usarlo
00:24:55
desde nuestras clases
00:24:57
DAO implementación, que son
00:24:58
las que tocan ya la base de datos.
00:25:01
¿Podemos quitar esto?
00:25:04
¿Sí?
00:25:06
¿Sí? ¿No?
00:25:07
¿Hasta dónde?
00:25:10
La property es la que tiene la conexión.
00:25:23
La localhost, MySQL,
00:25:25
la cadena de conexión. ¿Vale?
00:25:27
Venga, pues ahora
00:25:45
abrimos nuestro
00:25:46
DAO implementación, que ahora lo vamos a hacer distinto.
00:25:48
Lo vamos a hacer
00:25:50
Con JDBC puro
00:25:51
Sino con este de aquí
00:25:53
Entonces
00:25:58
Los métodos que teníais
00:25:58
Dejadlos vacíos directamente
00:26:03
Porque ahora ya no lo vamos a hacer
00:26:06
O no lo vais a hacer con JDBC puro
00:26:08
Los limpiáis y los vaciáis
00:26:09
Vacíos
00:26:11
Y el da implementación vuestro
00:26:12
Os acordáis, tendría ahí
00:26:15
Un connection, ¿no?
00:26:17
Que es luego el que usan
00:26:19
Un connection o un pool, depende
00:26:21
Que es el que usaban luego los métodos de abajo
00:26:23
Pues ahora no vamos a usar ese
00:26:26
Connection, vamos a usar este
00:26:29
¿Vale? Vale, pues entonces
00:26:30
Vamos a usar este objeto
00:26:36
Pues mi venta da implementación
00:26:38
Necesita este objeto
00:26:40
Necesita este objeto que como veis de forma
00:26:41
Muy sencilla, lo va a hacer todo
00:26:44
Ahora vamos aquí
00:26:46
¿Vale? Ahora vamos aquí abajo
00:26:48
Pero como veis, mis códigos
00:26:50
De 6, 7, 8, 9, 10 líneas
00:26:52
veréis en que se han reducido
00:26:54
ahora los miramos más en detalle
00:26:57
esto es solo para un primer vistazo
00:26:58
aquí, dime
00:26:59
claro, todo lo que hay
00:27:02
dentro de los métodos fuera
00:27:04
porque ahora la implementación va a ser con Spring JDBC
00:27:06
no va a ser con JDBC puro
00:27:09
y lo que os estaba diciendo
00:27:10
todavía no escribéis nada
00:27:15
como un primer vistazo
00:27:17
mirad como se han reducido
00:27:19
ahora ya yo hago los SQL
00:27:21
y ni gestiono excepciones
00:27:23
Ni me preocupo de los recursos
00:27:25
De abrir la sentencia
00:27:28
Nada
00:27:31
El JDC Template tiene métodos para hacer lo que yo quiera
00:27:31
¿Vale?
00:27:35
Por ejemplo
00:27:37
Vamos al insert
00:27:37
Si abrís JDC Template
00:27:40
Punto, veréis que se despliega
00:27:43
Hay una cantidad de cosas para hacer mil cosas
00:27:44
Que uno se puede meter, investigar y averiguar
00:27:46
Pero que queremos hacer
00:27:48
Insert, delete, update
00:27:50
Pues JDC Template, update
00:27:51
y ahí ya metemos
00:27:54
el SQL que queramos
00:27:56
con interrogaciones
00:27:58
en las
00:28:00
en las variables
00:28:02
y luego después
00:28:04
pongo tantos parámetros
00:28:06
como interrogación necesite
00:28:10
pam pam pam
00:28:12
pues need comprador
00:28:14
redcoach en el color
00:28:15
este es mi insert, me da implementación
00:28:16
para el insert
00:28:20
esto tú habrás
00:28:22
borrado el antiguo y escribirás esto.
00:28:27
O sea,
00:28:31
hemos reducido unas cuantas líneas
00:28:31
a esto.
00:28:34
¿Vale? Sí, esto
00:28:36
lo que pasa es que esto todavía
00:28:42
esto lo vamos a escribir ahora.
00:28:44
Esto todavía no lo escribáis. ¿Vale?
00:28:46
Escribís este objeto para poder
00:28:47
hacer esto. ¿Vale?
00:28:49
¿Vale? Entonces,
00:28:53
se queda mucho más sencillo.
00:28:54
Pero claro, hacemos un segundinín.
00:28:57
Como veis, hemos puesto una
00:28:59
pequeña capita, pero
00:29:01
el SQL no lo enmascara
00:29:03
el SQL lo sigo escribiendo yo
00:29:05
y eso está muy bien
00:29:07
porque tengo un mínimo de control
00:29:08
para optimizar el rendimiento de la base de datos
00:29:11
si yo elijo el SQL, tengo un mínimo de control
00:29:13
¿vale?
00:29:15
vamos a
00:29:18
pasar de los find
00:29:19
por el delete, pues el delete
00:29:20
es lo mismo
00:29:23
jdbctemplate, update
00:29:23
y pongo mi delete
00:29:26
bueno, porque este método
00:29:28
recordáis que lo habíamos hecho
00:29:33
para que devolviera un boolean
00:29:34
con true si realmente borraba alguna columna
00:29:36
y false si no
00:29:38
y este método te devuelve el número de columnas
00:29:39
afectadas, entonces por eso
00:29:42
lo he igualado a 1 y he devuelto directamente
00:29:44
lo que dé
00:29:47
entonces el insert y el update
00:29:47
perdón, el insert
00:29:53
y el delete se han quedado
00:29:55
muy sencillos
00:29:57
Y ahora esto ya por dentro, hará el prepare statement, hará el setting, hará el ejecuter, lo hará ya todo, capturar a la excepción, todo el rollo, ¿vale? Pero me deja elegir el SQL.
00:29:58
Bueno, ¿el delete y el insert los tenéis escritos?
00:30:15
¿A cuál vamos? ¿Al insert?
00:30:22
Insert es hacer en SQL y aquí poner los tres parámetros de la venta, V.
00:30:30
A ver, si lo pones directamente
00:30:35
directamente no puedes
00:30:50
porque como va entrecomillado
00:30:51
sería como poner literalmente esto, no tendría sentido
00:30:52
podríamos hacer lo que
00:30:55
hicimos al principio de todo
00:30:57
que es cortar aquí las comillas
00:30:58
y concatenar
00:31:01
entonces ya sí que concatenaría con el valor
00:31:02
Pero volvemos a lo de siempre
00:31:04
Que entonces tú estás construyendo un string
00:31:06
Y en ese string
00:31:08
SQL estás metiendo
00:31:10
Lo que el tío te quiera meter aquí
00:31:12
Que en lugar de NIF comprador
00:31:14
Puede ser Drop Database
00:31:16
Lo has construido aquí y lo pasas a la base de datos
00:31:17
Con interrogaciones
00:31:21
Primero lo pasas a la base de datos
00:31:23
Le dices a la base de datos
00:31:25
Te la paso a medias
00:31:26
Ahora ya te voy a pasar el valor que va aquí
00:31:27
Entonces la base de datos ya sabe
00:31:30
que ahí tiene que llegar un valor
00:31:33
y si le llega un drop database pa pa pa
00:31:34
dice no, esto no me vale
00:31:36
sabe que le tiene que llegar
00:31:38
un valor para encajar en esa cajita
00:31:41
que él se está esperando
00:31:43
vas a la base de datos como en dos pasos
00:31:44
bueno
00:31:46
insert y delete entonces pues ya está
00:31:49
vale, ya hemos visto
00:31:51
alguna de las ventajas del Spring JDBC
00:31:53
que es jolín, que rápido
00:31:55
escribo yo esto
00:31:56
nos vamos al find by id por ejemplo
00:31:57
vale, el find by id
00:32:02
ya significa
00:32:04
recuperar un objeto venta
00:32:06
aquí se nos complicaba más
00:32:08
porque teníamos que hacer el result set
00:32:10
del result set ir campo por campo
00:32:12
construyendo el objeto
00:32:14
pues este es tan listo
00:32:15
que yo le hago el select
00:32:17
y me lo convierte en objeto
00:32:20
directamente, venta
00:32:22
me lo convierte en objeto
00:32:23
pero claro, como sabe
00:32:25
él de estas columnas
00:32:28
cuál es cuál en cada propiedad
00:32:30
del objeto, cómo sabe cómo construirlo
00:32:33
porque le tengo que dar
00:32:35
yo un objeto mapeo
00:32:37
que es el que nos falta poner aquí
00:32:38
¿vale? entonces
00:32:41
con este objeto le doy la información
00:32:42
de cómo se corresponden
00:32:45
los campos del result set
00:32:47
con las propiedades del objeto
00:32:48
con este mapeo
00:32:50
¿vale? entonces este mapeo
00:32:51
es una interfaz funcional de las que
00:32:55
tanto os gustan
00:32:57
el mapeo
00:32:57
es una interfaz funcional
00:32:59
row mapper, que el mismo
00:33:02
nombre lo dice, mapeo de filas
00:33:04
es una interfaz funcional
00:33:06
magnífica, en este caso
00:33:07
es una bifuncción
00:33:09
recibe
00:33:11
dos valores y te devuelve algo
00:33:13
que recibe
00:33:16
el result set
00:33:19
y un siguiente parámetro que es el número de columnas
00:33:20
del result set, pero ese
00:33:23
lo podemos usar aquí o no, da igual
00:33:25
depende de lo que queramos hacer en este mapper
00:33:27
este mapper está abierto a que hagamos mil cosas
00:33:28
Pero bueno, el mapper sencillo es, cojo mi result set y con él construyo el objeto que es el que me devuelve el mapper, ¿vale?
00:33:30
Entonces, de mi result set, la propiedad IDE, llévala, claro, hacéos un constructor en venta con todos los parámetros,
00:33:44
Que no lo tendréis
00:33:55
Porque si no, no pasa nada
00:33:56
Pero tendríamos que poner aquí las llavecitas
00:33:58
Y hacer un new venta
00:33:59
Set, set, set, set
00:34:01
Y luego retún venta
00:34:02
Entonces para que quede más cortito
00:34:03
La interfaz funcional
00:34:05
Haceos un constructor con todos los parámetros en venta
00:34:06
Es decir, aquí en venta
00:34:11
Que donde está venta
00:34:13
Aquí
00:34:15
Haceos un constructor con todos los parámetros
00:34:16
Y así la interfaz funcional
00:34:20
Queda más cortita
00:34:23
Bueno, sí, porque tengo uno
00:34:26
Sin ID
00:34:31
Porque, bueno, es como principio básico
00:34:31
Tú cuando instancias un objeto venta
00:34:34
No le das el ID
00:34:36
Porque es auto, entonces, hombre, este es
00:34:38
Pero vamos, el que nos importa ahora
00:34:40
Es este
00:34:42
Entonces, hacéos uno con todos los parámetros
00:34:43
Con el único objeto
00:34:46
De luego escribir ese mapper
00:34:48
Más rápido
00:34:51
Porque si no, tenéis que hacer el new ventas
00:34:51
set, set, set, set, set y retúmbela.
00:34:54
¿Vale?
00:34:58
Un constructor con todos.
00:35:01
Dime.
00:35:05
Ah, que tú has levantado la mano hace un rato.
00:35:06
Es verdad, perdón. Se me había olvidado.
00:35:07
Es verdad, perdona.
00:35:10
Sí, vamos ahora.
00:35:16
Venga.
00:35:20
Venta la implementación.
00:35:23
¿Dónde estamos?
00:35:24
Entonces.
00:35:25
Ahora ya
00:35:26
Ese constructor con parámetros
00:35:28
Nos facilita hacer esta interfaz
00:35:32
Acabo de decir
00:35:34
Esta es una interfaz que
00:35:38
Asume, esto llámalo como queráis
00:35:39
X e Y, pero vamos, lo he llamado así
00:35:42
Para que se entienda
00:35:44
Claro, este dice
00:35:44
Cojo estos dos parámetros
00:35:48
Pero claro, para que esa interfaz funcional
00:35:49
Luego tenga sentido
00:35:52
Este RS
00:35:53
este RS
00:35:55
se supone que este RS
00:35:56
va a ser un objeto ResultSet
00:35:59
porque si no es un objeto
00:36:01
ResultSet
00:36:04
cuando luego esta interfaz funcional
00:36:05
entra en acción, que es esto de RSGETIN
00:36:08
¿vale?
00:36:10
o sea que
00:36:14
yo lo estoy copiando como teniendo fe
00:36:15
¿cómo?
00:36:17
no me hace falta tener fe
00:36:19
vale, pues ahora
00:36:21
lo vamos a explicar otra vez, dime
00:36:24
Que si puedo, ¿qué?
00:36:25
Sí, a ver
00:36:31
Espera, me bajo la coma aquí abajo
00:36:32
Ahí
00:36:33
Vale
00:36:35
Esta
00:36:38
Es una interfaz
00:36:40
A ver, vamos a repetirlo otra vez, ¿qué es esto?
00:36:42
Esto es un objeto
00:36:46
Interfaz funcional
00:36:47
¿Qué es un objeto interfaz funcional?
00:36:48
Es un objeto
00:36:51
No es un objeto que tenga un valor, no lo es
00:36:52
Es un objeto que hace algo, ¿vale?
00:36:55
Es decir, los datos pueden contener valores
00:36:58
o pueden contener comportamientos, las dos cosas.
00:37:00
Esa es la base de la programación funcional, ¿vale?
00:37:03
Pues este dato, mape,
00:37:06
este dato lo que contiene es un comportamiento, ¿vale?
00:37:08
Y ese comportamiento, ¿cómo lo programo yo?
00:37:12
¿Cómo lo especifico en Java?
00:37:14
Mediante una interfaz funcional,
00:37:15
mediante una función lambda, perdón,
00:37:17
mediante una función lambda,
00:37:18
es la forma de especificar comportamientos, ¿vale?
00:37:19
Pues esta función lambda me dice,
00:37:22
Tú dame dos parámetros
00:37:25
que yo con ellos te voy a construir
00:37:26
un objeto de esta manera.
00:37:28
Y te lo voy a devolver.
00:37:30
Pero claro, para que este
00:37:32
RSGetIn tenga sentido,
00:37:34
esto de aquí tiene que ser un
00:37:37
ResultSet, porque de los ResultSet,
00:37:38
de los queries, es de donde salen
00:37:41
estos valores.
00:37:42
La cosa es que en mi clip se dice
00:37:44
respecto a RS.
00:37:45
Pero tu clip no tiene por qué decir eso aquí.
00:37:48
Habéis importado el roadmap.
00:37:51
No tiene por qué decirte nada.
00:37:52
Claro, bueno, importa
00:37:55
Roadmapper, pero tu eclipse se tiene
00:37:57
Que callar, a una lambda tú le metes
00:37:59
Lo que le da la gana, si se lo va a tragar
00:38:01
Todo, luego otra cosa es cuando lo
00:38:03
Ejecute, pero mientras
00:38:05
Respetes la sintaxis
00:38:07
¿Vale?
00:38:08
O sea, el RSS
00:38:13
Por dentro también hace lo del
00:38:15
White hasnet
00:38:16
Eso lo hace
00:38:17
Luego el query for object
00:38:21
Esto lo único que te dice es
00:38:22
Si tú me das un registro
00:38:24
un result set posicionado
00:38:27
en un sitio, porque el result
00:38:29
William, ¿qué?
00:38:31
Espera un segundito.
00:38:33
Un segundito, voy a terminar de explicar esto que deje claro.
00:38:37
Que quede claro, vale, lo ponemos.
00:38:40
Vale, o sea, un result set
00:38:41
es un conjunto de registros
00:38:43
pero además con un indicador de posición.
00:38:45
Es las dos cosas
00:38:48
a la vez. Entonces,
00:38:49
este me dice, tú dame un result set
00:38:51
que tendrá su indicador de posición.
00:38:54
y yo con el registro que esté en esa
00:38:55
posición, sacaré su
00:38:58
campo id, su campo este, su campo
00:39:00
este, su campo este y te construyo un objeto
00:39:02
es lo que está diciendo
00:39:04
este comportamiento, tú dame un result set
00:39:06
que llevará dentro su indicador de fila
00:39:08
y yo con esa fila
00:39:10
te hago un objeto
00:39:12
y ahora, el num es un
00:39:13
segundo parámetro que necesita esta interfaz
00:39:16
funcional mapper, que
00:39:18
es el número de columnas del
00:39:19
result set, que no tenemos por
00:39:22
que usarlo aquí. O sea, esto es
00:39:24
para construir un objeto, pero a lo mejor
00:39:26
podríamos hacer una intensidad funcional, una
00:39:28
lambda más compleja, lo que tú verificarás antes
00:39:30
si num es
00:39:32
igual al número de columnas del result set
00:39:34
que lo puedes sacar, porque los objetos result set
00:39:36
tienen un método getMetadata, donde
00:39:38
sacas las columnas que tienen, patatín,
00:39:40
no me quiero meter en berenjenales, ¿vale?
00:39:42
Pero num es un parámetro
00:39:44
que
00:39:45
el roadmap debería interpretarlo
00:39:46
como número de columnas del result set.
00:39:50
que tú lo usas para hacer validaciones
00:39:52
aquí dentro, para hacer una lambda
00:39:54
complicadísima lo usas, que no
00:39:55
no lo usas, yo he hecho aquí
00:39:58
la versión sencillita, que a partir
00:39:59
de un result set con un número de
00:40:02
columnas num
00:40:03
posicionado en un sitio
00:40:04
me devuelves el objeto
00:40:07
correspondiente a esa fila
00:40:09
¿vale? eso es lo que me hace
00:40:12
esta lambda, ¿vale? ahora ¿cómo
00:40:13
vamos a usar esta lambda? pues ahora
00:40:15
ya esta lambda, ahora ya sí que bajamos
00:40:17
al find ID, ¿vale?
00:40:20
Ahora el findMyId
00:40:22
Es el que ya hace el query for object
00:40:23
Y ahí es donde se hace todo el while next
00:40:26
Todo el rollo
00:40:27
Y ahora, este query for object
00:40:28
Dice
00:40:32
Exacto, por eso se lo pasamos
00:40:32
Aquí, como parámetro
00:40:36
Entonces este query for object
00:40:37
Hace el select a través de
00:40:39
Las órdenes del mapper
00:40:42
Cada iteración del while
00:40:43
Va cogiendo y va llevando el objeto
00:40:45
Etcétera
00:40:48
En este caso, como estamos pasando
00:40:48
por id, yo llamo
00:40:51
al query for object, porque el query for object
00:40:53
me saca un objeto solo, pero es que aquí
00:40:55
encaja, claro, si no sería
00:40:57
pues que el de abajo, el find all
00:40:59
sería como el de abajo, dime
00:41:01
¿el num cuando lo estás usando?
00:41:02
no lo estoy usando, podría usarlo si quisiera
00:41:05
es lo que acabo de contarle a él, pero no lo estoy
00:41:07
usando, repito
00:41:09
el num se interpreta como
00:41:10
el número de columnas del registro
00:41:13
lo uso
00:41:15
si quisiera hacer esta
00:41:17
lambda más completa, más
00:41:19
enrollada, más yo que sé, pues que además me gusta
00:41:21
el número de columnas, pues cualquier cosa
00:41:23
si quisiera validar que el número
00:41:25
de columnas es el número de propiedades del objeto
00:41:27
para si no, devolverme un null
00:41:29
para lo que yo quisiera, pero no lo estoy usando aquí
00:41:30
lo estoy, ¿vale?
00:41:33
pero es eso, significa eso
00:41:35
vale
00:41:37
pues entonces
00:41:39
el
00:41:40
el find id
00:41:41
fijaos, se ha convertido
00:41:44
de la versión esta rollo
00:41:46
que teníamos en la otra
00:41:48
Ha pasado
00:41:50
De todo esto
00:41:53
Ha pasado
00:41:54
A esto
00:41:57
A esto
00:41:58
Hombre, pues si yo pongo aquí un retun
00:42:00
Es una línea
00:42:03
Hombre
00:42:04
Cuanto menos escribas
00:42:07
Menos opción
00:42:09
Tienes de equivocarte
00:42:12
¿Vale?
00:42:13
Cuanto menos escribas, menos opción tienes de equivocarte
00:42:15
Si tú tienes 20 novias, la vas a cagar seguro
00:42:18
Pues yo no tienes una, ¿no? Porque te fuerzan más.
00:42:20
Pues es lo mismo.
00:42:22
Cuantas más opciones tengas de cagarla,
00:42:24
peor.
00:42:26
Pues cuanto menos código escribas,
00:42:28
menos opciones de cagarla.
00:42:31
¿Vale?
00:42:33
Vale.
00:42:35
Pero daos cuenta de que esto,
00:42:36
pese a eso,
00:42:38
nos deja poner el
00:42:40
ese...
00:42:42
No vale
00:42:42
cagarla en la primera oportunidad.
00:42:46
Bueno.
00:42:48
En la primera idea del código ya la cagaste.
00:42:50
En fin.
00:42:54
¿Quién ha escrito venta con B?
00:42:54
¿Quién ha escrito venta con B?
00:42:57
Ah, creo que yo.
00:42:58
Vale, y ahora.
00:42:59
Por ejemplo.
00:43:01
Eso, lo único que puedes cagarla,
00:43:05
que es aquí, pues pone
00:43:06
JDBC, pones esto con B.
00:43:08
Ya está.
00:43:10
Vale, y el único que nos falta,
00:43:11
find all. Fijaos que
00:43:15
cortito se queda también.
00:43:16
ahora un query
00:43:18
y este
00:43:20
le digo el mapeo
00:43:22
y como este me va a devolver muchos
00:43:25
pues me devuelvo un list de venta
00:43:27
es que no tengo ni que hacer el list
00:43:30
ni que ir uno por uno añadiendo
00:43:31
¿vale?
00:43:33
en el otro venta da implementación
00:43:35
en el find all
00:43:37
tenía que hacerme el list
00:43:39
ir construyendo, ir añadiendo
00:43:40
capturar la excepción
00:43:42
todo este rollo tenía que hacer en el JDBC puro
00:43:43
en este ya está.
00:43:46
¿Vale?
00:43:49
Le tengo que dar el mapper, lógicamente.
00:43:50
¿Perdón?
00:43:53
Insertar venta, este.
00:43:55
Dime.
00:44:00
¿Cómo se podría usar el numarrio?
00:44:01
¿Qué métodos tiene?
00:44:03
A ver, el num es una variable.
00:44:05
Tú la usas para lo que quieras hacer en esa lambda.
00:44:07
Uso típico.
00:44:10
Solo quieres construir el objeto, por ejemplo,
00:44:11
si validas
00:44:14
que ese result set
00:44:16
es correcto porque tiene tantas columnas
00:44:18
como tiene tu objeto
00:44:21
pues entonces podrías hacer pues if num
00:44:22
igual a no sé qué, pues entonces ahora ya construyo
00:44:24
el objeto y lo devuelvo
00:44:26
que no, devuelvo null, yo que sé
00:44:28
podrías usarlo para lo que quisieras dentro de esa
00:44:30
lambda, nosotros no lo hemos usado para nada
00:44:32
hemos asumido que el result set viene con
00:44:34
todos los campos, que es un select asterisco
00:44:36
que viene con todo, lo hemos asumido y hemos creado el objeto
00:44:38
y se acabó, ¿vale?
00:44:40
vale, pues ya está
00:44:42
esta es nuestra implementación, ¿ya se ha acabado?
00:44:46
pues ya hemos hecho la libre
00:44:49
la segunda parte
00:44:51
¿hasta dónde?
00:44:53
hasta el enlace
00:44:57
hasta aquí
00:44:58
vale
00:45:00
entonces, ¿qué hemos hecho?
00:45:02
simplemente, de la aplicación anterior
00:45:06
hemos hecho una copia
00:45:08
hemos añadido el objeto jdbctemplate
00:45:09
al singleton para poder obtenerlo
00:45:12
y he cambiado los da implementación
00:45:14
es lo único que hemos cambiado
00:45:17
vale
00:45:18
y nos debería seguir funcionando la aplicación
00:45:22
vamos a verificarlo
00:45:25
antes de
00:45:27
de
00:45:28
irnos a los baños
00:45:30
o a lo que sea
00:45:33
voy a
00:45:34
lanzar la base de datos
00:45:37
Lo que tengo que crear es una base de datos.
00:45:46
Vale, a ver, yo tengo...
00:45:48
Vale.
00:45:51
Voy a ver si esta aplicación...
00:45:53
Porque no hay más cambios que hacer.
00:45:57
El base de datos properties está aquí con todo.
00:45:59
Solamente he cambiado el de implementación y el singleton.
00:46:02
Vale.
00:46:07
Pues voy a ejecutar esta copia y vosotros también, a ver si...
00:46:08
Porque no va a pegar error
00:46:16
No, confía, confía
00:46:18
Venga, vamos a cruzar los dedos
00:46:20
El Tomcat ha arrancado
00:46:26
Ahí está la aplicación
00:46:28
Listar ventas
00:46:30
Míralas, que bonita
00:46:31
Me salen los logs del sprint
00:46:33
JDBC
00:46:36
¿Vale? En la consola
00:46:36
Uno puede configurar la herramienta
00:46:39
Para que no muestre los logs
00:46:42
¿Vale? Y aquí sale todo tan estupendo
00:46:43
Sí, el delete
00:46:46
Aquí está
00:46:52
Vale, pues quien quiera ir al baño
00:46:54
Y cualquier cosa
00:46:56
Aprovechamos a quien hacer la paradinha
00:46:57
Un momentito
00:47:00
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Segundo Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 1
- Fecha:
- 11 de diciembre de 2025 - 17:27
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 47′ 02″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 200.72 MBytes