JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi...

32
JDBC: Conexiones con bases de datos desde Java Luis Fernando Llana D´ ıaz Departamento de Sistemas Inform´ aticos y Computaci´on Universidad Complutense de Madrid 21 de abril de 2008 Luis Fernando Llana D´ ıaz Departamento de Sistemas Inform´ aticos y Computaci´onUniversidad Complutense de Madrid JDBC: Conexiones con bases de datos desde Java

Transcript of JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi...

Page 1: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

JDBC: Conexiones con bases de datos desde Java

Luis Fernando Llana Dıaz

Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

21 de abril de 2008

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 2: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

JDBC

Conexion con una fuentes de datos.

Realizar peticiones y actualizaciones.

Manejar los resultados de las consultas

Aplicacion Java

JDBC

DBMSMySQL

DBMSOracle

DBMSPostgresSQL

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 3: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Drivers JDBC

Es necesario un driver dependiente del proveedor de la Base dedatos.

MySQL MySQL java connector

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 4: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Creando la base de datos

Fichero crea.sql

1create database valores;

2use valores;

34create table valores (

5id int unsigned auto_increment primary key ,

6nombre varchar (255),

7ibex_id varchar (100),

8url varchar (255) ,

9tipo enum("acciones","fondos")

10);

1112create table datos (

13id int unsigned auto_increment primary key ,

14valor int unsigned ,

15fecha date ,

16precio double ,

17index (fecha),

18unique index (fecha ,valor)

19);

2021grant all on valores .* to luis identified by ’diez799 ’;

1~/sql$ mysql -u root < crea.sql

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 5: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Interfaz java.sql.Connection

Establece conexion con la base de datos. No tiene constructor.

Es un interfaz (esta implementado en el driver).

Constuye instrucciones SQL precompiladas (metodoprepareStatement).

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 6: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizando conexion con la base de datos

1package valores;

2import java.sql.Connection;

3import java.sql.DriverManager;

4import java.sql.SQLException;

56public class Conexion {

7protected static Connection getMysqlConnection(String url , String db,

8String user , String passwd)

9throws ClassNotFoundException ,

10InstantiationException ,

11SQLException ,

12IllegalAccessException {

13Class.forName("com.mysql.jdbc.Driver"). newInstance ();

14return DriverManager.getConnection("jdbc:mysql ://"+url+"/"+db+

15"?user="+user+"&password="+passwd );

16}

17protected static Connection getMysqlConnection ()

18throws ClassNotFoundException ,

19InstantiationException ,

20SQLException ,

21IllegalAccessException {

22return getMysqlConnection("localhost", "valores", "luis", "patata");

23}

24protected static String getFich(String fich) {

25java.net.URL url = ClassLoader.getSystemResource(fich);

26return url.getPath ();

27}

28}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 7: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Ficheros de datos

Fichero de valores: valores.csv

BSCH ·BSCH ·acciones ·http ://www.bolsamadrid.es/esp/mercados/acciones/accind1_1.htmEndesa ·ENDESA ·acciones ·http ://www.bolsamadrid.es/esp/mercados/acciones/accind1_1.htmRepsol - YPF·REPSOL YPF ·acciones ·http ://www.bolsamadrid.es/esp/mercados/acciones/accind1_1.htmAcciona ·ACCIONA ·acciones ·http :// www.bolsamadrid.es/esp/mercados/acciones/accind1_1.htmInditex ·INDITEX ·acciones ·http :// www.bolsamadrid.es/esp/mercados/acciones/accind1_1.htmTelefonica ·TELEFONICA ·acciones ·http ://www.bolsamadrid.es/esp/mercados/acciones/accind1_1.htmBanco Popular·BA . POPULAR ·acciones ·http ://www.bolsamadrid.es/esp/mercados/acciones/accind1_1.htmEbro - Puleva·EBRO PULEVA ·acciones ·http :// www.bolsamadrid.es/esp/mercados/acciones/igbm_3_1.htmMittal - Steel·ARCELOR MIT. ·acciones ·http :// www.bolsamadrid.es/esp/mercados/acciones/igbm_2_1.htmIndra·INDRA A ·acciones ·http ://www.bolsamadrid.es/esp/mercados/acciones/igbm_6_1.htmEADS ·EADS ·acciones ·http ://www.bolsamadrid.es/esp/mercados/acciones/igbm_2_1.htmUnipapel ·UNIPAPEL ·acciones ·http :// www.bolsamadrid.es/esp/mercados/acciones/igbm_3_1.htmMadrid Bolsa·MADRID BOLSA ·fondos ·http ://www.bolsamadrid.es/esp/mercados/fondos/htmfondos /0085 alfa.htmPlus Madrid ·PLUSMADRID ·fondos ·http :// www.bolsamadrid.es/esp/mercados/fondos/htmfondos /0085 alfa.htmFonCaixa 65 ·FONCAIXA 65 BOLSA INDICE ESPA &#241; A ·fondos ·http ://www.bolsamadrid.es/esp/mercados/fondos/htmfondos /0015 alfa100.htm

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 8: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Cargar datos

1package valores;

2import java.io.BufferedReader;

3import java.io.FileReader;

4import java.io.IOException;

5import java.sql.Connection;

6import java.sql.PreparedStatement;

7import java.sql.SQLException;

8import java.util.Scanner;

9public class LeeValores {

10private static void insertaDatos(Connection con , BufferedReader in)

11throws IOException , SQLException {

12.....................

13}

14public static void main (String [] args) throws Exception {

15Connection con = null;

16BufferedReader in = null;

17try {

18con = Conexion.getMysqlConnection ();

19in = new BufferedReader(new FileReader(Conexion.getFich("sql/valores.csv")));

20insertaDatos(con ,in);

21} finally {

22if (con!=null) con.close ();

23if (in!=null) in.close ();

24}

25}

26}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 9: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

¿Donde esta el fichero sql/valores.csv?

1.

2|-- |-- sql

3| |-- borra.sql

4| |-- crea.sql

5| |-- datos.csv

6| |-- usuarios.csv

7| ‘-- valores.csv

8|-- src

9| |-- valores

10| | |-- CVS

11| | | |-- Entries

12| | | |-- Repository

13| | | ‘-- Root

14| | |-- Conexion.java

15| | |-- ConsigueDatos.java

16| | |-- ConsigueDatos.java .~1.1.~

17| | |-- LeeDatos.java

18| | ‘-- LeeValores.java

19|-- classes

20| ‘-- valores

21| |-- Conexion.class

22| |-- ConsigueDatos.class

23| |-- LeeDatos.class

24| ‘-- LeeEmpresas.class

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 10: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Accediendo sql/valores.csv

Los objetos de clase ClassLoader permitend acceder a losrecursos Java.

1java.net.URL url = ClassLoader.getSystemResource(fich);

fich debe estar dentro del CLASSPATH en la ejecucion.

1~/Java$ export CLASSPATH =.:./ classes

2~/Java$ $JAVA_HOME/bin/java valores.LeeValores

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 11: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Cargar datos

1private static final String sqlIns =

2"insert into valores (nombre ,ibex_id ,url ,tipo) "+

3"values ( ? , ? , ? , ?)";

4private final static int NOMBRE =1;

5private final static int IBEX_ID =2;

6private final static int URL_BOLSA =3;

7private final static int TIPO =4;

89private static void insertaDatos(Connection con , BufferedReader in)

10throws IOException , SQLException {

11String linea = in.readLine ();

12PreparedStatement pstmt = con.prepareStatement(sqlIns );

13while (linea!=null) {

14Scanner scan = new Scanner(linea);

15scan.useDelimiter(" · ");16String nombre = scan.next ();

17String ibex_id = scan.next ();

18String tipo = scan.next ();

19String url = scan.next ();

20System.out.println(nombre+":"+ibex_id+":"+tipo+":"+url);

21pstmt.setString(NOMBRE ,nombre );

22pstmt.setString(IBEX_ID ,ibex_id );

23pstmt.setString(TIPO ,tipo);

24pstmt.setString(URL_BOLSA ,url);

25int n = pstmt.executeUpdate ();

26linea=in.readLine ();

27}

28}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 12: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Ficheros de datos

Fichero de valores: valores.csv

Fecha ·BSCH ·ENDESA ·REPSOL - YPF ·ACCIONA ·INDITEX ·Telefonica ·Banco Popular·Ebro - Puleva·Mittal Steel ·INDRA ·AEDS ·Unipapel ·Madrid Bolsa ·PlusMadrid ·Fon Caixa 65

28/03/02 ·9 .6 ·17 .05 ·14 .45 · · · · · · · · · · 1 2 .35 ·17 .33 ·5 .4901/04/02 ·9 .6 ·17 .05 ·14 .45 · · · · · · · · · · 1 2 .35 ·17 .33 ·5 .49· · · · · · · · · · · · · · ·27/08/04 ·8 ·15 .25 ·16 .98 ·50 .15 ·19 ·11 .83 · · · · · · · 1 1 .81 ·17 .03 ·4 .6430/08/04 ·7 .99 ·15 .29 ·17 .03 ·50 .05 ·19 .08 ·11 .78 · · · · · · · 1 1 .89 ·17 .1 ·4 .6612/12/06 ·14 .01 ·35 .76 ·27 .71 ·137 .95 ·39 .59 ·16 .06 ·13 .7 ·18 .62 ·31 .5 ·18 .35 · · · 2 1 .08 ·25 .22 ·8 .15· · · · · · · · · · · · · · ·19/12/06 ·13 .98 ·35 .15 ·26 .96 ·138 .2 ·40 .78 ·16 .11 ·13 .7 ·19 .17 ·31 .25 ·18 .15 ·24 .20 · ·21 .51 ·25 .57 ·8 .3520/12/06 ·14 .08 ·35 .16 ·26 .92 ·139 .9 ·40 .95 ·16 .28 ·13 .68 ·19 .28 ·31 .86 ·18 .42 ·25 .45 · ·21 .4 ·25 .47 ·8 .3721/12/06 ·14 .06 ·35 .43 ·26 .6 ·140 .9 ·40 .61 ·16 .15 ·13 .65 ·19 .25 ·31 .86 ·18 .46 ·25 .79 · ·21 .2 ·25 .29 ·8 .33· · · · · · · · · · · · · · ·27/12/06 ·14 .16 ·35 .72 ·26 .5 ·140 ·41 .01 ·16 .2 ·13 .69 ·19 .59 ·31 .95 ·19 .06 ·26 .07 ·21 .34 ·21 .16 ·25 .25 ·8 .2628/12/06 ·14 .12 ·35 .55 ·26 .41 ·141 .05 ·40 .89 ·16 .16 ·13 .68 ·19 .12 ·32 .26 ·18 .67 ·26 .00 ·21 .40 ·21 .05 ·25 .14 ·8 .1829/12/06 ·14 .14 ·35 .83 ·26 .2 ·141 .1 ·40 .81 ·16 .12 ·13 .73 ·19 .2 ·32 ·18 .61 ·26 .00 ·21 .50 ·21 .23 ·25 .3 ·8 .1801/01/07 ·14 .14 ·35 .83 ·26 .2 ·141 .1 ·40 .81 ·16 .12 ·13 .73 ·19 .2 ·32 ·18 .61 ·26 .00 ·21 .50 ·21 .18 ·25 .24 ·8 .1802/01/07 ·14 .49 ·35 .57 ·26 .63 ·143 .05 ·40 .79 ·16 .39 ·13 .97 ·19 .46 ·32 .87 ·18 .88 ·26 .29 ·21 .85 ·21 .18 ·25 .24 ·8 .18

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 13: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Cargar datos

1private static void insertaDatos(Connection con , BufferedReader in)

2throws IOException , SQLException , ParseException {

3int [] id_valores = valores(con);

4String linea = in.readLine ();

5linea = in.readLine ();

6String sql = "insert into datos (fecha ,valor ,precio) values ( ?, ? , ? )";

7PreparedStatement pstmt = con.prepareStatement(sql);

8while (linea!=null) {

9Scanner scan = new Scanner(linea);

10scan.useDelimiter(" · ");11String strFecha=scan.next ();

12if (! strFecha.equals("")) {

13DateFormat df = new SimpleDateFormat("dd/MM/yy");

14Date fecha = df.parse(strFecha );

15System.out.println(df.format(fecha ));

16for (int i = 0; i < id_valores.length ; i++) {

17String strValor = scan.next ();

18if (! strValor.equals("")) {

19double precio = Double.parseDouble(strValor );

20pstmt.setDate(1,new java.sql.Date(fecha.getTime ()));

21pstmt.setInt(2, id_valores[i]);

22pstmt.setDouble(3,precio );

23int n = pstmt.executeUpdate ();

24}

25}

26}

27linea = in.readLine ();

28}

29}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 14: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Cargar datos

1private static String [] valores = {

2"BSCH","ENDESA","REPSOL YPF",

3"ACCIONA","INDITEX","TELEFONICA",

4"BA.POPULAR","EBRO PULEVA","ARCELOR MIT.",

5"INDRA A","EADS","UNIPAPEL","MADRID BOLSA",

6"PLUSMADRID","FONCAIXA 65 BOLSA INDICE ESPA &#241;A"

7};

8private static int [] valores(Connection con) throws SQLException {

9int [] ids = new int[valores.length ];

10String sql = "select id from valores where ibex_id like ?";

11PreparedStatement pstmt = con.prepareStatement(sql);

12for (int i = 0; i < ids.length; i++) {

13pstmt.setString(1,valores[i]);

14ResultSet rs = pstmt.executeQuery ();

15rs.next ();

16ids[i]=rs.getInt (1);

17}

18return ids;

19}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 15: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizar actualizaciones

Instrucciones: INSERT, UPDATE, DELETE

1public static void pr2(Connection con) throws SQLException {

2String sql = "update datos set precio=precio +1";

3PreparedStatement pstmt = con.prepareStatement(sql);

4int n = pstmt.executeUpdate ();

5System.out.println(n+" filas actualizadas");

6SQLWarning warning = pstmt.getWarnings ();

7if (warning !=null) {

8System.out.println("AVISOS ...");

9while (warning !=null) {

10System.out.println("Message: " + warning.getMessage ());

11warning = warning.getNextWarning ();

12}

13} else {

14System.out.println("No hay avisos");

15}

16}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 16: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizar Consultas

Instrucciones Select

1select id,nombre ,tipo from valores

ResultSet rs = pstmt.executeQuery();

rs.next();

rs id nombre tipo

rs

1 BSCH acciones

rs

2 Endesa acciones

rs

3 Repsol-YPF acciones

rs

4 Acciona acciones

rs

5 Inditex acciones

rs

6 Telefonica acciones

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 17: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizar Consultas

Instrucciones Select

1select id,nombre ,tipo from valores

ResultSet rs = pstmt.executeQuery();

rs.next();

rs

id nombre tipo

rs 1 BSCH acciones

rs

2 Endesa acciones

rs

3 Repsol-YPF acciones

rs

4 Acciona acciones

rs

5 Inditex acciones

rs

6 Telefonica acciones

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 18: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizar Consultas

Instrucciones Select

1select id,nombre ,tipo from valores

ResultSet rs = pstmt.executeQuery();

rs.next();

rs

id nombre tipo

rs

1 BSCH acciones

rs 2 Endesa acciones

rs

3 Repsol-YPF acciones

rs

4 Acciona acciones

rs

5 Inditex acciones

rs

6 Telefonica acciones

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 19: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizar Consultas

Instrucciones Select

1select id,nombre ,tipo from valores

ResultSet rs = pstmt.executeQuery();

rs.next();

rs

id nombre tipo

rs

1 BSCH acciones

rs

2 Endesa acciones

rs 3 Repsol-YPF acciones

rs

4 Acciona acciones

rs

5 Inditex acciones

rs

6 Telefonica acciones

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 20: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizar Consultas

Instrucciones Select

1select id,nombre ,tipo from valores

ResultSet rs = pstmt.executeQuery();

rs.next();

rs

id nombre tipo

rs

1 BSCH acciones

rs

2 Endesa acciones

rs

3 Repsol-YPF acciones

rs 4 Acciona acciones

rs

5 Inditex acciones

rs

6 Telefonica acciones

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 21: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizar Consultas

Instrucciones Select

1select id,nombre ,tipo from valores

ResultSet rs = pstmt.executeQuery();

rs.next();

rs

id nombre tipo

rs

1 BSCH acciones

rs

2 Endesa acciones

rs

3 Repsol-YPF acciones

rs

4 Acciona acciones

rs 5 Inditex acciones

rs

6 Telefonica acciones

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 22: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizar Consultas

Instrucciones Select

1select id,nombre ,tipo from valores

ResultSet rs = pstmt.executeQuery();

rs.next();

rs

id nombre tipo

rs

1 BSCH acciones

rs

2 Endesa acciones

rs

3 Repsol-YPF acciones

rs

4 Acciona acciones

rs

5 Inditex acciones

rs 6 Telefonica acciones

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 23: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Realizar Consultas

Instrucciones Select

1select id,nombre ,tipo from valores

ResultSet rs = pstmt.executeQuery();rs.next();

rs

id nombre tipo

rs

1 BSCH acciones

rs

2 Endesa acciones

rs

3 Repsol-YPF acciones

rs

4 Acciona acciones

rs

5 Inditex acciones

rs

6 Telefonica acciones

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 24: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Ejemplos de consultas I

1public static void pr1(Connection con) throws SQLException {

2String sql = "select * from valores";

3PreparedStatement pstmt = con.prepareStatement(sql);

4ResultSet rs = pstmt.executeQuery ();

5while (rs.next ()) {

6int id = rs.getInt("id");

7String nombre = rs.getString("nombre");

8System.out.println(id+":"+nombre );

9}

10}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 25: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Ejemplos de consultas II

1public static void pr3(Connection con) throws SQLException {

2String sql = "select valores.nombre , datos.fecha , datos.precio "+

3" from datos left join valores on valores.id=datos.valor "+

4" where datos.fecha >=’2007-03-01’"+

5" order by valores.tipo , valores.nombre , datos.fecha";

6PreparedStatement pstmt = con.prepareStatement(sql);

7ResultSet rs = pstmt.executeQuery ();

8while (rs.next ()) {

9String nombre = rs.getString("valores.nombre");

10Date fecha = rs.getDate("datos.fecha");

11double precio = rs.getDouble("datos.precio");

12DateFormat df = new SimpleDateFormat("dd ’de’ MMMM ’de’ yyy");

13NumberFormat nf = new DecimalFormat("#,000.00’ o \euroo ’");

14System.out.println(df.format(fecha)+"\t"+nombre+"\t"+nf.format(precio ));

15}

16}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 26: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Ejemplos de consultas III

1public static int getID(String ibex_id , Connection con) throws SQLException {

2String sql = "select id from valores where ibex_id like ’"+ibex_id+"’";

3PreparedStatement pstmt = con.prepareStatement(sql);

4ResultSet rs = pstmt.executeQuery ();

5if (rs.next ()) {

6return rs.getInt (1);

7} else {

8return -1;

9}

10}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 27: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Consiguiendo datos desde www.bolsamadrid.es

Conseguir el fichero HTML.

Analizar el fichero.

Anadir datos en la base de datos.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 28: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Conseguir el fichero HTML

Fichero de valores: valores.csv

1private static String cargaPagina(java.net.URL url)

2throws IOException{

3InputStream in = url.openStream ();

4StringBuffer sb = new StringBuffer ();

5int c = in.read ();

6while (c!=-1) {

7sb.append ((char)c);

8c = in.read ();

9}

10String res = sb.toString ();

11return res;

12}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 29: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Analizar el fichero HTML

Fichero de valores:http://www.bolsamadrid.es/esp/mercados/acciones/accind1_1.htm

1.....................

2....<IMG SRC="/images/arr -up9.gif" BORDER =0> BSCH</A></TD><TD>13,50</TD>.....

3.....................

4....<IMG SRC="/images/arr -dw9.gif" BORDER =0> ENDESA </A></TD><TD>40,29</TD>...

1private static double getValor(String ibexID , String datos , String tipo)

2throws ParseException {

3String regExp=null;

4if (tipo.equals("acciones")) {

5regExp=ibexID+" *</A></TD ><TD >([0-9,]+) </TD >";

6} else if (tipo.equals("fondos")) {

7regExp=ibexID+" *</a></TD >.*?<TD *[^>]* >([0-9,]+)</TD>";

8} else {

9throw new RuntimeException("Tipo \’"+tipo+"\’ desconocido");

10}

11Pattern p = Pattern.compile(regExp );

12Matcher m = p.matcher(datos);

13if (m.find ()) {

14// Double. parseDouble no vale , no analiza 13 ,50

15NumberFormat nf = NumberFormat.getInstance ();

16return nf.parse(m.group (1)). doubleValue ();

17} else {

18throw new RuntimeException("Acciones \’"+ibexID+"\’ no encontrada");

19}

20}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 30: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Insertar los datos en la Base de datos

1private static final String sqlIns =

2"insert into datos (fecha ,valor ,precio) values( ? , ? , ?)";

3private static final int FECHA =1;

4private static final int VALOR =2;

5private static final int PRECIO =3;

67private static void insertaDatos(java.sql.Date fecha ,Connection con)

8throws SQLException , IOException , ParseException {

9HashMap <String ,String > paginas = new HashMap <String ,String >();

10String sql = "select * from valores";

11PreparedStatement pstmtValores = con.prepareStatement(sql);

12ResultSet rs = pstmtValores.executeQuery ();

13PreparedStatement pstmtIns = con.prepareStatement(sqlIns );

14while (rs.next ()) {

15insertaDatos(pstmtIns ,

16fecha ,

17rs,paginas );

18}

19}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 31: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Insertar los datos en la Base de datos

1private static void insertaDatos(PreparedStatement pstmtIns ,

2java.sql.Date fecha ,

3ResultSet rs,

4HashMap <String ,String > paginas)

5throws SQLException ,IOException , ParseException {

6String url = rs.getString("url");

7String datos = paginas.get(url);

8if (datos==null) {

9datos = cargaPagina(paginas ,url));

10paginas.put(url ,datos);

11}

12String tipo = rs.getString("tipo");

13String ibexID = rs.getString("ibex_id");

14double valor = getValor(ibexID ,datos ,tipo);

15int id = rs.getInt("id");

16String nombre = rs.getString("nombre");

17pstmtIns.setDate(FECHA ,fecha);

18pstmtIns.setInt(VALOR ,id);

19pstmtIns.setDouble(PRECIO ,valor);

20int n = pstmtIns.executeUpdate ();

21}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java

Page 32: JDBC: Conexiones con bases de datos desde Javaantares.sip.ucm.es/luis/Java07-08/JDBC.pdfJDBC Conexi on con una fuentes de datos. Realizar peticiones y actualizaciones. Manejar los

Consiguiendo datos automaticamente

1#!/ bin/sh

2# $Id: transparencias .tex ,v 1.8 2007 -05 -10 11:37:22 luis Exp $

34JAVA_HOME =/usr/lib/jvm/java -1.5.0 - sun

5CLASSPATH =/home/casa/ahorros2/classes

6$JAVA_HOME/bin/java -cp $CLASSPATH valores.ConsigueDatos $*

1$ crontab -l

23SHELL=/bin/bash

4MAILTO=luis

5# Directorios donde buscar programas

6PATH=/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/home/luis/bin

7845 23 * * 1,2,3,4,5 /home/casa/ahorros2/scripts/consigueDatos.sh > /dev/null 2>&1

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ComputacionUniversidad Complutense de Madrid

JDBC: Conexiones con bases de datos desde Java