Salta el contingut

1. Connectant a bases de dades

1.1. Controlador JDBC de MySQL

Per tal de crear programes Java utilitzant el controlador de MySQL, necessitem carregar-lo en el nostre programa i prèviament en el nostre entorn de desenvolupament. Si utilitzeu un IDE com IntelliJ IDEA o Eclipse, podeu afegir el controlador JDBC com a dependència del vostre projecte. Si utilitzeu Maven o Gradle, podeu afegir la dependència al vostre fitxer pom.xml o build.gradle.

  1. Hem de trobar la versió del controlador del nostre servidor JDBC, i ho podem trobar al repositori central de Maven https://mvnrepository.com.
  2. Cerquem mysql jdbc, i obtindrem com a primer resultat MySQL Connector/J.
  3. Assegureu-vos de seleccionar la versió correcta, i després seleccioneu el gestor de paquets (gradle, maven, etc.) i obtindreu:
XML
1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>    
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>
Bash
// https://mvnrepository.com/artifact/mysql/mysql-connector-java
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.30'
  1. Quan deseu o compileu el vostre projecte, podreu importar els controladors correctament.

mysql-gradle

1.2. URL de connexió

Un cop hagueu importat el controlador, heu de dir al vostre programa Java com connectar-vos a la vostra base de dades i finalment connectar-vos-hi. Per a aquesta tasca, hem de crear una Connection utilitzant una URL especial anomenada URL de connexió. Com altres URL, una URL de connexió pot contenir:

  • Protocol \(\rightarrow\) utilitzarem jdbc.
  • SGBD \(\rightarrow\) podríem utilitzar mysql, postgres, sqlite, sqlserver o qualsevol SGBD amb un connector JDBC.
  • Adreça del servidor \(\rightarrow\) podem utilitzar tant un nom complet com l'adreça IP del servidor.
  • [opcional]Port \(\rightarrow\) el port on el servidor està escoltant. Si no s'utilitza cap, el controlador intentarà connectar-se al port per defecte. Recordeu separar el port de l'adreça amb :.
  • Altres paràmetres, separant-los amb ? al principi i amb & entre els paràmetres. Per exemple:
    • user=usuari
    • pass=contrasenya
    • useUnicode=true
    • characterEncoding=UTF-8

Una mostra de URL de connexió pot ser:

Java
String connectionUrl = "jdbc:mysql://localhost:3308/Cycling?useUnicode=true&characterEncoding=UTF-8&user=root&password=root";

Una opció millor seria:

Java
String server="localhost";
int port=3308;
String user="root";
String pass="root";
String DBName="Cycling";
String connectionUrl = "jdbc:mysql://"+server+":"+port;
connectionUrl+="/" + DBName;
connectionUrl+="?useUnicode=true&characterEncoding=UTF-8";
connectionUrl+="&user="+user;
connectionUrl+="&password="+pass;

Atenció

Tingueu en compte que tots dos exemples són codi hard-coded, ja que teniu els valors del servidor (usuari i contrasenya) escrits dins de cadenes de text. És millor opció emmagatzemar aquests valors dins de variables o fitxers de propietats.

1.3. Classe Connection

En Java, la classe necessària per gestionar el controlador és java.sql.DriverManager. Intenta carregar els controladors del sistema quan llegeix la propietat dels controladors JDBC, però podem indicar que es carregui utilitzant la instrucció:

Java
Class.forName("com.mysql.cj.jdbc.Driver");

La classe que centralitzarà totes les operacions amb la base de dades és java.sql.Connection, i l'hem d'obtenir des del DriverManager amb qualsevol dels 3 mètodes estàtics que té:

  • static Connection getConnection(String url) \(\rightarrow\) Retorna una connexió, si és possible, a la base de dades amb els paràmetres especificats a la URL de connexió. Recordeu de crear una URL de connexió a partir de la part anterior.
  • static Connection getConnection(String url, Properties info) \(\rightarrow\) Retorna una connexió, si és possible, a la base de dades, amb alguns paràmetres especificats a la URL i altres en un objecte de propietats (Properties classe estudiada a la unitat 1). Veurem exemples més endavant.
  • static Connection getConnection(String url, String user, String pass) \(\rightarrow\) Retorna una connexió, si és possible, a la base de dades amb els paràmetres especificats a la URL. Les dades d'usuari i contrasenya es proporcionen en dos paràmetres addicionals, de manera que no cal escriure'ls a la URL de connexió.

Una mostra inicial serà:

Java
public static void main (String [] args ) 
  throws ClassNotFoundException, SQLException{

    Class.forName("com.mysql.cj.jdbc.Driver");
    String server="localhost";
    int port=3308;
    String user="root";
    String pass="root";
    String DBName="Cycling";
    String connectionUrl = "jdbc:mysql://"+server+":"+port;
    connectionUrl+="/" + DBName;
    connectionUrl+="?useUnicode=true&characterEncoding=UTF-8";

   Connection conn = DriverManager.getConnection(connectionUrl,user,pass);

   // if no exception is catched, you are connected to your DBMS

Amb l'objecte Connection que tenim ara connectat, enviarem les nostres consultes i demanarem informació, com veurem més endavant.

1.4. Organitzant la nostra connexió

La nostra aplicació s'ha de connectar a una (o més) bases de dades. Podem fer moltes peticions a aquestes base de dades, i si estem implementant una aplicació multithreaded, el nombre de peticions pot augmentar molt. Per això, hem de controlar on i quan es creen i es tanquen les connexions. Una bona idea és crear una classe que encapsuli tots aquests processos. L'esquelet d'aquesta classe seria el següent:

Java
public class ConnexioBD {

    private Connection laConnexio = null;

    // write here access variables, like user, server or whatever

    private void connect() {
        // do the connetion (look the sample). 
        // Take care. private method. It will be called inside the class
    }

    // close connection, if it's opened
    public void disConnect() {
        if (laConnexio != null) {
            laConnexio.close();
        }
    }

    // returns the connection. 
    // It will be create first time of after closed
    public Connection getConexio(){
        if (laConnexio == null) {
            this.connect();
        }
        return this.laConnexio;
    } 
}

1.4.1. Exercici resolt

Crea un projecte únic amb dues classes. Una per connectar-te a la teva base de dades, com l'últim exemple, i una classe principal que es connecti i mostri si hi ha hagut algun error.

La solució de l'exercici està enllaçada aquí connexio.properties i ConnexioDB.java