Skip to content

Commit 4c57d34

Browse files
committed
Pequeñas correcciones a Conectores
1 parent e15d293 commit 4c57d34

File tree

9 files changed

+102
-144
lines changed

9 files changed

+102
-144
lines changed

source/04.conector/01.basico.rst

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,9 @@ El código tiene dos aspectos:
132132
Tampoco las sentencias de inserción devuelven resultados, por lo que supuesto
133133
que hayamos definido la clase ``Centro``:
134134

135-
.. literalinclude:: files/CentroS.java
135+
.. literalinclude:: files/Centro.java
136136
:language: java
137+
:name: clase-centro
137138
:class: toggle
138139
:caption: Centro.java
139140

@@ -212,8 +213,8 @@ de objetos de Java, Por ejemplo, podríamos hacer esto:
212213
int id = rs.getInt("id");
213214
String nombre = rs.getString("nombre");
214215
String titularidad = rs.getString("titularidad");
215-
// Posiblemente titularidad debería ser un enum.
216-
centros.add(new Centro(id, nombre, titularidad));
216+
// Quizás deberíamos comprobar que titularidad es válido.
217+
centros.add(new Centro(id, nombre, Titularidad.fromString(titularidad)));
217218
}
218219
}
219220

source/04.conector/02.datos.rst

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,23 @@ equivalente propio de Java.
2323
.. table::
2424
:class: tipos-sql
2525

26-
+---------------------------+-------------------------+--------------------------------------+
27-
| Tipo |SQL| | Tipo Java\ [#]_ | Método |JDBC| de |PreparedStatement| |
28-
+===========================+=========================+======================================+
29-
| | CHAR(n) | :java-lang:`String` | setString(int idx, String v) |
30-
| | VARCHAR(n) | | |
31-
+---------------------------+-------------------------+--------------------------------------+
32-
| | SMALLINT | | :java-lang:`Short` | | setShort(int idx, short v) |
33-
| | INTEGER | | :java-lang:`Integer` | | setInt(int idx, int v) |
34-
| | BIGINT | | :java-lang:`Long` | | setLong(int idx, long v) |
35-
+---------------------------+-------------------------+--------------------------------------+
36-
| BOOLEAN | :java-lang:`Boolean` | | setBoolean(int idx, boolean v) |
37-
+---------------------------+-------------------------+--------------------------------------+
38-
| NUMERIC/DECIMAL\ [#]_ | :java-lang:`BigDecimal` | | setBigDecimal(int idx, BigDecimal) |
39-
+---------------------------+-------------------------+--------------------------------------+
40-
| | FLOAT, REAL\ [#]_ | | :java-lang:`Float` | | setFloat(int idx, float v) |
41-
| | FLOAT, DOUBLE PRECISION | | :java-lang:`Double` | | setDouble(int idx, double v) |
42-
+---------------------------+-------------------------+--------------------------------------+
26+
+------------------------------+-------------------------+--------------------------------------+
27+
| Tipo |SQL| | Tipo Java\ [#]_ | Método |JDBC| de |PreparedStatement| |
28+
+==============================+=========================+======================================+
29+
| | CHAR(n) | :java-lang:`String` | setString(int idx, String v) |
30+
| | VARCHAR(n) | | |
31+
+------------------------------+-------------------------+--------------------------------------+
32+
| | SMALLINT | | :java-lang:`Short` | | setShort(int idx, short v) |
33+
| | INTEGER | | :java-lang:`Integer` | | setInt(int idx, int v) |
34+
| | BIGINT | | :java-lang:`Long` | | setLong(int idx, long v) |
35+
+------------------------------+-------------------------+--------------------------------------+
36+
| BOOLEAN | :java-lang:`Boolean` | | setBoolean(int idx, boolean v) |
37+
+------------------------------+-------------------------+--------------------------------------+
38+
| NUMERIC/DECIMAL\ [#]_ | :java-lang:`BigDecimal` | | setBigDecimal(int idx, BigDecimal) |
39+
+------------------------------+-------------------------+--------------------------------------+
40+
| | FLOAT(n), REAL\ [#]_ | | :java-lang:`Float` | | setFloat(int idx, float v) |
41+
| | FLOAT(n), DOUBLE PRECISION | | :java-lang:`Double` | | setDouble(int idx, double v) |
42+
+------------------------------+-------------------------+--------------------------------------+
4343

4444
.. note:: No hay más que sustituir `set` por `get` para obtener los métodos de
4545
|PreparedStatement| necesarios para guardar datos.
@@ -82,7 +82,7 @@ no es un tipo primitivo en Java, pero su uso es trivial:
8282
);
8383
8484
Internamente, :program:`SQLite` sólo dispone de datos de tipo texto, entero (de
85-
diverso tamaño), doble y BLOB; y dependiendo del valor que se suministre usará
85+
diverso tamaño), doble y blob; y, dependiendo del valor que se suministre, usará
8686
un tipo u otro para el dato. Así, ``CHAR`` y ``VARCHAR`` se asimilan a texto,
8787
``INTEGER``, ``BIGINT``, ``SMALLINT`` y ``BOOLEAN`` a enteros, ``FLOAT``,
8888
``DOBLE`` y ``NUMERIC``/``DECIMAL`` a dobles (por tanto, se perderá la precisión

source/04.conector/10.extras.rst

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ simplificar la creación del pool y abstraernos de qué se usa para crearlo,
1717
podemos envolverlo en una clase como esta:
1818

1919
.. literalinclude:: files/ConnectionPool.java
20+
:class: toggle
21+
:caption: ConnectionPool.java
2022
:name: clase-connectionpool
2123
:language: java
2224
:start-at: public class
@@ -45,6 +47,11 @@ mismos parámetros, devolverá el pool ya creado y no otro distinto:
4547
pool1 == pool4; // false
4648
ConnectionPool pool5 = PoolConnection.getInstance(); // IllegalArgumentException (hay dos, ¿cuál?)
4749
50+
.. warning:: Obsérvese la |URL| que se ha utilizado en los ejemplos. En el caso
51+
particular de *SQLite*, para que las distintas conexiones del *pool* abran
52+
conexión a la misma base de datos en memoria, no basta con que la ruta sea
53+
:file:`:memory:`, sino que ha de usarse :file:`file::memory:?cache=shared`.
54+
4855
.. _conn-sqlutils:
4956

5057
Tratamiento funcional de las consultas
@@ -57,30 +64,43 @@ paliarlo podemos definir una clase que haga la conversión (véase el
5764

5865
.. literalinclude:: files/SqlUtils.java
5966
:language: java
67+
:class: toggle
68+
:caption: ConnectionPool.java
6069
:start-at: public class
6170

62-
Si incluimos este archivo en nuestro proyecto podremos hacer consultas de este
63-
modo:
71+
la cual usa una excepción de usuario no protegida que debe estar también
72+
definida:
73+
74+
.. literalinclude:: files/DataAccessRuntimeException.java
75+
:language: java
76+
:class: toggle
77+
:caption: DataAccessRuntimeException.java
78+
79+
Con estas clases y definiendo un método estático para convertir un registro de
80+
la tabla *Centro* (esto es, un |ResultSet|) en un objeto ``Centro``:
81+
82+
.. code-block:: java
83+
84+
public static Centro resultSetToCentro(ResultSet rs) throws SQLException {
85+
int id = rs.getInt("id");
86+
String nombre = rs.getString("nombre");
87+
Titularidad titularidad = Titularidad.fromString(rs.getString("titularidad"));
88+
return new Centro(id, nombre, titularidad);
89+
}
90+
91+
se puede obtener un objeto :java-util:`Stream <stream/Stream>` que permita recorrer los
92+
resultados de la consulta:
6493

6594
.. code-block:: java
66-
:emphasize-lines: 6-14
95+
:emphasize-lines: 6
6796
6897
// No los cerramos, porque se encargara el cierre del flujo de hacerlo.
6998
Statement stmt = conn.createStatement();
7099
ResultSet rs = stmt.executeQuery("SELECT * FROM Centro");
71-
72-
try ( // try-with-resources para asegurarnos de liberar los recursos (stmt y rs)
73-
Stream<Centro> centros = SqlUtils.resultSetToStream(stmt, rs, fila -> {
74-
// Esta función puede generar un SQLException
75-
int id = fila.getInt("id");
76-
String nombre = fila.getString("nombre");
77-
// Suponemos que hemos definido mejor Titularidad y hemos creado
78-
// un método estático que obtiene Titularidad.PUBLICA a partir de "pública", etc.
79-
Titularidad titularidad = Titularidad.fromNombre(fila.getString("titularidad"));
80-
return new Centro(id, nombre, titularidad);
81-
});
82-
) {
83-
//Tratamos el flujo como estimemos más oportuno.
100+
101+
// try-with-resources para asegurarnos de liberar los recursos (stmt y rs)
102+
try (Stream<Centro> centros = SqlUtils.resultSetToStream(stmt, rs, Main::resultToCentro)) {
103+
// Tratamos el flujo como estimemos más oportuno.
84104
for(Centro c: (Iterable<Centro>) centros::iterator) {
85105
System.out.println(c);
86106
}
@@ -100,12 +120,7 @@ modo:
100120
Statement stmt = conn.createStatement();
101121
ResultSet rs = stmt.executeQuery("SELECT * FROM Centro");
102122
) {
103-
centros = SqlUtils.resultSetToStream(stmt, rs, fila -> {
104-
int id = fila.getInt("id");
105-
String nombre = fila.getString("nombre");
106-
Titularidad titularidad = Titularidad.fromNombre(fila.getString("titularidad"));
107-
return new Centro(id, nombre, titularidad);
108-
});
123+
centros = SqlUtils.resultSetToStream(stmt, rs, Main::resultToCentro);
109124
}
110125
111126
for(Centro c: centros) {
@@ -129,7 +144,7 @@ modo:
129144
.. code-block:: java
130145
131146
try(Stream<ResultSet> result = SqlUtils.resultSetToStream(stmt, rs)) {
132-
// Tratamiento del rs (sin usar next, porque ya avanza el solo)
147+
// Tratamos el resultado como un Stream.
133148
}
134149
135150
.. _conn-transaction-manager:

source/04.conector/15.dao.rst

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,8 @@ ambas manejan de igual modo su identificador:
5151
.. literalinclude:: files/Entity.java
5252
:name: clase-Entity
5353

54-
La clase ``Centro`` es esta:
55-
56-
.. literalinclude:: files/Centro.java
57-
:language: java
58-
:name: clase-centro
59-
:caption: Centro.java
60-
:class: toggle
61-
:start-at: public class
62-
63-
que incluye la definición del enum ``Titularidad``. La del ``Estudiante`` es esta
64-
otra:
54+
La clase :ref:`Centro <clase-centro>` ya se definió anteriormente.
55+
``Estudiante`` es esta otra:
6556

6657
.. literalinclude:: files/Estudiante.java
6758
:language: java

source/04.conector/files/Centro.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public static enum Titularidad {
1717
this.desc = desc;
1818
}
1919

20-
public String getDescripcion() {
20+
@Override
21+
public String toString() {
2122
return desc;
2223
}
2324

@@ -26,9 +27,11 @@ public String getDescripcion() {
2627
* @param desc La descripción
2728
* @return El elemento Titularidad o null, si no hay ninguno con esa descripción.
2829
*/
29-
public static Titularidad fromDesc(String desc) {
30+
public static Titularidad fromString(String desc) {
3031
return Arrays.stream(Titularidad.values())
31-
.filter(t -> t.getDescripcion().compareToIgnoreCase(desc) == 0).findFirst().orElse(null);
32+
.filter(t -> t.getDescripcion().compareToIgnoreCase(desc) == 0)
33+
.findFirst()
34+
.orElse(null);
3235
}
3336
}
3437

source/04.conector/files/CentroS.java

Lines changed: 0 additions & 79 deletions
This file was deleted.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package edu.acceso.testjdbc;
2+
3+
public class DataAccessRuntimeException extends RuntimeException {
4+
5+
public DataAccessRuntimeException(String message) {
6+
super(message);
7+
}
8+
9+
public DataAccessRuntimeException(Throwable e) {
10+
super(e);
11+
}
12+
13+
public DataAccessRuntimeException(String message, Throwable e) {
14+
super(message, e);
15+
}
16+
}

source/04.conector/files/SqlUtils.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ public boolean hasNext() {
2222
if(avanzar) {
2323
try {
2424
if(rs.isClosed()) {
25-
throw new DataAccessException("ResultSet is closed!!!");
25+
throw new DataAccessRuntimeException("ResultSet is closed!!!");
2626
}
2727
hasNextElement = rs.next();
2828
}
2929
catch(SQLException err) {
30-
throw new DataAccessException(err);
30+
throw new DataAccessRuntimeException(err);
3131
}
3232
finally {
3333
avanzar = false;
@@ -53,19 +53,19 @@ public static interface CheckedFunction<T, R> {
5353
}
5454

5555
/**
56-
* Transforma el SQLException que propaga una CheckedFUnction en un DataAccessException, que es una excepción
57-
* que no necesita ser declarada.
56+
* Transforma el SQLException que propaga una CheckedFUnction en un DataAccessRuntimeException,
57+
* que es una excepción que no necesita ser declarada.
5858
* @param <T> El tipo que devuelve CheckedFunction.
5959
* @param checked Un "función" CheckedFunction.
60-
* @return Una "función" que ha sustituido SQLException por DataAccessException.
60+
* @return Una "función" que ha sustituido SQLException por DataAccessRuntimeException.
6161
*/
6262
public static <T> Function<ResultSet, T> checkedToUnchecked(CheckedFunction<ResultSet, T> checked) {
6363
return t -> {
6464
try {
6565
return checked.apply(t);
6666
}
6767
catch(SQLException err) {
68-
throw new DataAccessException(err);
68+
throw new DataAccessRuntimeException(err);
6969
}
7070
};
7171
}
@@ -88,7 +88,7 @@ public static Stream<ResultSet> resultSetToStream(AutoCloseable ac, ResultSet rs
8888
ac.close();
8989
}
9090
catch(Exception err) {
91-
throw new DataAccessException(err);
91+
throw new DataAccessRuntimeException(err);
9292
}
9393
});
9494
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
public static Centro resultSetToCentro(ResultSet rs) throws SQLException {
2+
3+
int id = rs.getInt("id");
4+
String nombre = rs.getString("nombre");
5+
// Suponemos que hemos definido mejor Titularidad y hemos creado
6+
// un método estático que obtiene Titularidad.PUBLICA a partir de "pública", etc.
7+
Titularidad titularidad = Titularidad.fromString(rs.getString("titularidad"));
8+
9+
return new Centro(id, nombre, titularidad);
10+
11+
}

0 commit comments

Comments
 (0)