Skip to content

Commit 32f5cfb

Browse files
committed
Actualiza conectores
1 parent 3ee8cec commit 32f5cfb

File tree

13 files changed

+528
-221
lines changed

13 files changed

+528
-221
lines changed

source/04.conector/01.basico.rst

Lines changed: 46 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -129,25 +129,33 @@ El código tiene dos aspectos:
129129
+ Las ejecutamos usando el método ``executeUpdate``, puesto que su función es
130130
modificar el contenido de la base de datos, no obtener información.
131131

132-
Tampoco las sentencias de inserción devuelven resultados, por lo que también
132+
Tampoco las sentencias de inserción devuelven resultados, por lo que supuesto
133+
que hayamos definido la clase ``Centro``:
134+
135+
.. literalinclude:: files/CentroS.java
136+
:language: java
137+
:class: toggle
138+
:caption: Centro.java
139+
133140
podemos hacer:
134141

135142
.. code-block:: java
136143
:name: ej-insert-sin-par
137144
138-
// Agregamos algunos centros
145+
// Estos son los INSERT que quedaron pendientes en el código anterior
139146
stmt.executeUpdate("INSERT INTO Centro VALUES (11004866, 'IES Castillo de Luna', 'pública')");
140147
141-
Object[] registros = new Object[][] {
142-
new Object[] {11007533, "IES Arroyo Hondo", "pública"},
143-
new Object[] {11701164, "IES Astaroth", "pública"}
144-
};
148+
Centro[] centros = new Centro[] {
149+
new Centro(11007533, "IES Arroyo Hondo", "pública"),
150+
new Centro(11701164, "IES Astaroth", "pública")
151+
}
152+
145153
String sqlString = "INSERT INTO Centro VALUES (%d, '%s', '%s');"
146-
for(Object[] registro: registros) {
154+
for(Centro centro: centros) {
147155
stmt.executeUpdate(String.format(sqlString,
148-
(Integer) registro[0],
149-
(String) registro[1],
150-
(String) registro[2]
156+
centro.getId(),
157+
centro.getNombre(),
158+
centro.getTitularidad()
151159
));
152160
}
153161
@@ -191,29 +199,22 @@ objeto |ResultSet| que se va consumiendo a medida que obtenemos registros de él
191199

192200
En el ejemplo, nos hemos limitado a imprimirlos, pero si nuestro programa
193201
pretendiera hacer algo útil, tendríamos que trasladar esta información al modelo
194-
de objetos de Java, Por ejemplo, suponiendo que hubiéramos definido una clase
195-
``Centro`` así:
196-
197-
.. literalinclude:: files/CentroS.java
198-
:language: java
199-
:class: toggle
200-
:caption: Centro.java
201-
202-
podríamos hacer esto:
202+
de objetos de Java, Por ejemplo, podríamos hacer esto:
203203

204204
.. code-block:: java
205205
206206
207+
Lista<Centro> centros = null;
207208
try(ResultSet rs = stmt.executeQuery("SELECT * FROM Centro")) {
208-
List<Centro> centros = new ArrayList<>();
209-
210-
while(rs.next()) {
211-
int id = rs.getInt("id");
212-
String nombre = rs.getString("nombre");
213-
String titularidad = rs.getString("titularidad");
214-
// Posiblemente titularidad debería ser un enum.
215-
centros.add(new Centros(id, nombre, titularidad));
216-
}
209+
centros = new ArrayList<>();
210+
211+
while(rs.next()) {
212+
int id = rs.getInt("id");
213+
String nombre = rs.getString("nombre");
214+
String titularidad = rs.getString("titularidad");
215+
// Posiblemente titularidad debería ser un enum.
216+
centros.add(new Centro(id, nombre, titularidad));
217+
}
217218
}
218219
219220
.. important:: Obsérvese que tiene que ser el programador el que traduzca el modelo
@@ -249,19 +250,19 @@ mecanismo para parametrizar sentencias; y, en el caso de |JDBC|, se hace uso de
249250
:name: ej-insert-par
250251
:emphasize-lines: 8, 11-13
251252
252-
Object[] registros = new Object[][] {
253-
new Object[] {11004866, "IES Castillo de Luna", "pública"},
254-
new Object[] {11007533, "IES Arroyo Hondo", "pública"},
255-
new Object[] {11701164, "IES Astaroth", "pública"}
256-
};
253+
Centro[] centros = new Centro[] {
254+
new Centro(11004866, "IES Castillo de Luna", "pública"),
255+
new Centro(11007533, "IES Arroyo Hondo", "pública"),
256+
new Centro(11701164, "IES Astaroth", "pública")
257+
}
257258
258259
try(
259260
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO Centro (id, nombre, titulacion) VALUES (?, ?, ?)")
260261
) {
261-
for(Object[] registro: registros) {
262-
pstmt.setInt(1, (int) registro[0]); // id
263-
pstmt.setString(2, (String) registro[1]); // nombre
264-
pstmt.setString(3, (String) registro[2]); // titulación
262+
for(Centro centro: centros) {
263+
pstmt.setInt(1, centro.getId());
264+
pstmt.setString(2, centro.getNombre());
265+
pstmt.setString(3, centro.getTitularidad());
265266
pstmt.executeUpdate();
266267
}
267268
}
@@ -281,9 +282,9 @@ identificador se definió. Para ello podemos hacer lo siguiente:
281282
282283
TimeDateFormatter df = TimeDateFormatter.ofPattern("dd/MM/yyyy");
283284
// centro es un centro que ya tenemos definido.
284-
Object[][] registros = new Object[][] {
285-
new Object[] {"Perico de los Palotes", LocalDate.parse("12/06/1995", df), centro},
286-
new Object[] {"Mariquilla de la O", LocalDate.parse("07/09/1999", df), centro}
285+
Profesor[] profesores = new Profesor[] {
286+
new Profesor ("Perico de los Palotes", LocalDate.parse("12/06/1995", df), centro),
287+
new Profesor ("Mariquilla de la O", LocalDate.parse("07/09/1999", df), centro)
287288
};
288289
289290
try(
@@ -292,11 +293,11 @@ identificador se definió. Para ello podemos hacer lo siguiente:
292293
Statement.RETURN_GENERATED_KEYS
293294
)
294295
) {
295-
for(Object[] registro: registros) {
296-
pstmt.setString(1, registro[0]);
297-
pstmt.setDate(2, registro[1] == null?null:Date.valueOf(registro[1]));
296+
for(Profesor profesor: profesores) {
297+
pstmt.setString(1, profesor.getNombre());
298+
pstmt.setDate(2, profesor.getNacimiento() == null?null:Date.valueOf(profesor.getNacimiento()));
298299
pstmt.setObject(3, centro == null?null:centro.getId(), Types.INTEGER);
299-
pstmt.setNull(4, Types.INTEGER);
300+
pstmt.setNull(4, Types.INTEGER); // Lo debe generar automáticamente el SGBD
300301
pstmt.executeUpdate();
301302
try(ResultSet rs = pstmt.getGeneratedKeys()) {
302303
if(rs.next()) System.out.printf("'%s' se registró con ID=%d\n", registro[0], rs.getInt(1));
@@ -309,7 +310,7 @@ identificador se definió. Para ello podemos hacer lo siguiente:
309310
Necesitaremos :ref:`más adelante <conn-batch>` darle al menos una vuelta más.
310311

311312
Obsérvese que al definir los valores de los parámetros de una consulta,
312-
necesitamos cambiar de método según sea el tipo del campos. Sin embargo,
313+
necesitamos cambiar de método según sea el tipo del campo. Sin embargo,
313314
|JDBC| permite usar un método genérico (``setObject``) que se encargará de
314315
inferir el tipo |SQL| correcto a partir del tipo de *Java*. La razón por la que
315316
en el ejemplo se añade un tercer parámetro se debe a que el valor puede ser nulo

source/04.conector/02.datos.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ los mapas de *Python* o *Java*:
329329
.. rubric:: Notas al pie
330330

331331
.. [#] Se han referido clases, pero también equivalen a tipos primitivos (``short`` en vez de :java-lang:`Short`).
332-
.. [#] Ambos tipos representan número reales de coma fija y necesitan que se
332+
.. [#] Ambos tipos representan número reales de coma fija y necesitan que
333333
se les proporcionen dos parámetros: la :dfn:`precisión` (el número total de cifras)
334334
y la :dfn:`escala` (el número de cifras decimales). Por ejemplo,
335335
``NUMERIC(10, 2)`` es un número de 10 cifras, dos de las cuales son

source/04.conector/03.transacciones.rst

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,20 @@ pertenezcan a una misma transacción debemos hacer lo siguiente:
2727
.. code-block:: java
2828
:emphasize-lines: 8, 17, 21, 24
2929
30-
Object[] registros = new Object[][] {
31-
new Object[] {11004866, "IES Castillo de Luna", "pública"},
32-
new Object[] {11007533, "IES Arroyo Hondo", "pública"},
33-
new Object[] {11701164, "IES Astaroth", "pública"}
30+
Centro[] centros = new Centro[] {
31+
new Centro(11004866, "IES Castillo de Luna", "pública"),
32+
new Centro(11007533, "IES Arroyo Hondo", "pública"),
33+
new Centro(11701164, "IES Astaroth", "pública")
3434
};
3535
String sqlString = "INSERT INTO Centro VALUES (?, ?, ?);"
3636
3737
conn.setAutoCommit(false); // Evitamos que cada sentencia implique una transacción
3838
3939
try(PreparedStatement pstmt = conn.prepareStatement(sqlString)) {
40-
for(Object[] registro: registros) {
41-
pstmt.setInt(1, (int) registro[0]);
42-
pstmt.setString(2, (String) registro[1]);
43-
pstmt.setString(3, (String) registro[2]);
40+
for(Centro centro: centros) {
41+
pstmt.setInt(1, centro.getId());
42+
pstmt.setString(2, centro.getNombre());
43+
pstmt.setString(3, centro.getTitularidad());
4444
pstmt.executeUpdate();
4545
}
4646
conn.commit(); // Después de ejecutar todas las sentencias, las confirmamos.
@@ -71,20 +71,20 @@ precisamente), el modo más eficiente para llevarlas a cabo es el siguiente:
7171
.. code-block:: java
7272
:emphasize-lines: 15, 17
7373
74-
Object[] registros = new Object[][] {
75-
new Object[] {11004866, "IES Castillo de Luna", "pública"},
76-
new Object[] {11007533, "IES Arroyo Hondo", "pública"},
77-
new Object[] {11701164, "IES Astaroth", "pública"}
74+
Centro[] centros = new Centro[] {
75+
new Centro(11004866, "IES Castillo de Luna", "pública"),
76+
new Centro(11007533, "IES Arroyo Hondo", "pública"),
77+
new Centro(11701164, "IES Astaroth", "pública")
7878
};
7979
String sqlString = "INSERT INTO Centro VALUES (?, ?, ?);"
8080
8181
conn.setAutoCommit(false); // Evitamos que cada sentencia implique una transacción
8282
8383
try(PreparedStatement pstmt = conn.prepareStatement(sqlString)) {
84-
for(Object[] registro: registros) {
85-
pstmt.setInt(1, (int) registro[0]);
86-
pstmt.setString(2, (String) registro[1]);
87-
pstmt.setString(3, (String) registro[2]);
84+
for(Centro centro: centros) {
85+
pstmt.setInt(1, centro.getId());
86+
pstmt.setString(2, centro.getNombre());
87+
pstmt.setString(3, centro.getTitularidad());
8888
pstmt.addBatch(); // Añadimos la inserción al procedimiento.
8989
}
9090
pstmt.executeBatch(); // Ejecutamos todas las inserciones pendientes.

source/04.conector/04.pool.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ Su uso, por otro lado es muy sencillo:
158158
159159
ds.close(); // Se liberan recursos.
160160
161+
.. tip:: Más adelante se sugiere una :ref:`estrategia para crear el pool
162+
<conn-pool-extra>`.
163+
161164
.. |JDBC| replace:: :abbr:`JDBC (Java DataBase Connectivity)`
162165
.. |SGBD| replace:: :abbr:`SGBD (Sistema Gestor de Bases de Datos)`
163166
.. |Connection| replace:: :java-sql:`Connection <Connection>`

source/04.conector/10.extras.rst

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ de él, en vez de encontrarse incrustadas en el código.
170170

171171
Sin embargo, |JDBC| no tiene definido un método que nos permita ejecutar un
172172
guión |SQL| completo y que pasemos una cadena larga con todas instrucciones
173-
separadas por comas, no aegura que el |SGBD| las descomponga y ejecute
173+
separadas por comas, no asegura que el |SGBD| las descomponga y ejecute
174174
individualmente\ [#]_. La única forma segura de poder ejecutar sus sentencias
175175
es descomponerlas primero. Para ello podemos optar por dos estrategias:
176176

@@ -179,16 +179,15 @@ es descomponerlas primero. Para ello podemos optar por dos estrategias:
179179
capaz de procesar el código |SQL| y, por tanto, reconocer los elementos de que
180180
se compone.
181181

182-
+ Si el guión no es complejo y seguimos algunas premisas:
182+
+ Podemos escribir una solución artesanal, si el guión no es complejo y seguimos
183+
algunas premisas:
183184

184185
a. Los ';' que completan sentencias deben encontrarse a final de línea.
185186
#. No pueden usarse las palabras ``begin`` o ``end`` en comentarios, nombres,
186187
valores, etc.
187188
#. No pueden usarse bloques ``IF`` en aquellos |SGBD| que los implementen
188189
(pero sí usarse el estándar ``CASE``).
189190

190-
podemos escribir una solución artesanal, que es la que proponemos.
191-
192191
.. literalinclude:: files/splitSQL.java
193192
:language: java
194193

0 commit comments

Comments
 (0)