name: portada class: portada-slide, center, middle # JDBC .footnote[Joan Puigcerver Ibáñez] --- layout: true class: regular-slide .right[.logo[]] --- # JDBC JDBC (Java DataBase Connectivity) és una API que permet a les aplicacions Java accedir mitjançant una interfície comuna a les bases de dades. --- # Drivers Perquè Java es puga comunicar en la base de dades necessita els drivers necessaris, que li indica el protocol de comunicació que ha de seguir. Per exemple, no es comunica de la mateixa manera una BBDD MySQL que un PostgreSQL. S'ha d'afegir la llibreria corresponent al projecte. A IntelliJ es pot trobar a __File > Project Structure > Libraries__ Des d'aquí, la podem afegir manualment o baixar-la des d'un repositori de Maven. Per PostgreSQL podem trobar els drivers si busquem __org.postgresql:postgresql__. --- # Projecte amb BBDD Quan implementem un projecte amb accès a BBDD, cal tindre clar el propòsit de cada Class i organitzar-les en els packages corresponents. Un exemple de projecte seria el següent: ```text project ├── data │ ├── Database.java │ └── RectangleDAO.java ├── models │ └── Rectangle.java ├── ui │ └── MenuPrincipal.java └── RectangleApp.java ``` * __data__: Classes que gestionen l'accès a les BBDD. * __DAO__: Les classes DAO(Data Acces Object) son les encarregades de gestionar les operacions amb la BBDD d'un tipus d'objecte determinat. * __models__: L'estructura dels objectes dins la nostra aplicació. .center[BBDD -> RectangleDAO -> Rectangle] --- # Connexió Per comunicar-se amb la BBDD s'ha de crear una connexió. La podem crear de la següent manera: Les connexions han de tancar-se una vegada has acabat amb ella. ```java // La sintaxi canvia depenent del tipus de BBDD a la que et vulguis connectar. private static String URL = "jdbc:postgresql://url:port/"; private static String BD = "baseDeDades"; private static String USER = "user"; private static String PASS = "password"; public static Connection connect(){ try { return DriverManager.getConnection(URL + BD, USER, PASS); } catch (SQLException e) { e.printStackTrace(); } return null; } ``` --- # Query - Insertar Les operacions a la BBDD es realitzen mitjançant queries. * __PreparedStatement__: Construeix una query amb variables, que s'assignaran després (semblant al printf). Per exemple, la operació d'insertar un Rectangle a una BBDD: ```java public void insert(Rectangle r){ try{ Connection connection = Database.connect(); // Obrim la connexió String query = "INSERT INTO rectangles(width, height) VALUES(?, ?)"; PreparedStatement insertStatement = connection.prepareStatement(query); insertStatement.setInt(1, r.getWidth()); insertStatement.setInt(2, r.getHeight()); insertStatement.execute(); // Executem la query connection.close(); // Tanquem la connexió }catch (SQLException e){ System.out.println(e.getMessage()); } } ``` --- # Query - List Si la query no té variables, la podem definir com __Statement__. El mètode Statement.executeQuery(query) ens retorna un ResultSet que podem recórrer per veure els resultats de la query. Exemple: Recuperar la llista de rectangles d'una BBDD. ```java public List
list(){ List
list = new ArrayList<>(); try{ Connection connection = Database.connect(); String query = "SELECT * FROM rectangles"; Statement listStatement = connection.createStatement(); ResultSet resultat = listStatement.executeQuery(query); while (resultat.next()){ int id = resultat.getInt("id"); int width = resultat.getInt("width"); int height = resultat.getInt("height"); list.add(new Rectangle(id, width, height)); } connection.close(); }catch (SQLException e){ System.out.println(e.getMessage()); } return list; } ``` --- # Query - Delete ```java public boolean delete(int id){ try{ Connection connection = Database.connect(); String query = "DELETE FROM rectangles WHERE id = ?"; PreparedStatement insertStatement = connection.prepareStatement(query); insertStatement.setInt(1, id); insertStatement.execute(); connection.close(); return true; }catch (SQLException e){ System.out.println(e.getMessage()); } return false; } ``` --- # Query - Update ```java public boolean update(Rectangle r){ try{ Connection connection = Database.connect(); String query = "UPDATE rectangles SET(width, height) = (?, ?) WHERE id = ?"; PreparedStatement insertStatement = connection.prepareStatement(query); insertStatement.setInt(1, r.getWidth()); insertStatement.setInt(2, r.getHeight()); insertStatement.setInt(3, r.getId()); insertStatement.execute(); connection.close(); return true; }catch (SQLException e){ System.out.println(e.getMessage()); } return false; } ```