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__. --- # 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 String URL = "jdbc:postgresql://url:port/"; String BD = "baseDeDades"; String USER = "user"; String PASS = "password"; try (Connection connection = DriverManager.getConnection(URL + BD, USER, PASS)){ // Usar la connexió aquí } ``` --- # 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 String query = "INSERT INTO rectangles(width, height) VALUES(?, ?)"; PreparedStatement insertStatement = connection.prepareStatement(query); insertStatement.setInt(1, 34); insertStatement.setInt(2, 77); insertStatement.execute(); ``` --- # 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. --- # Query - List ```java String listQuery = "SELECT * FROM rectangles"; Statement listStatement = connection.createStatement(); ResultSet resultat = listStatement.executeQuery(listQuery); List
list = new ArrayList<>(); 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)); } System.out.println(list); ``` --- # Query - Delete ```java String query = "DELETE FROM rectangles WHERE id = ?"; PreparedStatement insertStatement = connection.prepareStatement(query); insertStatement.setInt(1, id); insertStatement.execute(); ``` --- # Query - Update ```java 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(); ``` --- # 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 ``` --- # Projecte amb BBDD * __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] --- # Database ``` public class RectangleDatabase { private static String URL = "jdbc:postgresql://url:port/"; private static String BD = "baseDeDades"; private static String USER = "user"; private static String PASS = "password"; Connection connection; public Connection connect() throws SQLException { connection = DriverManager.getConnection(URL + BD, USER, PASS); return connection; } public Connection getConnection() { return connection; } } ``` --- # RectangleDao ``` public class RectangleDao { RectangleDatabase database; public RectangleDao(RectangleDatabase database) { this.database = database; } public Connection getConnection(){ return database.getConnection(); } public List
list() throws SQLException { //TODO } public void insert(Rectangle rectangle) throws SQLException { //TODO } } ``` --- # RectangleDao - insert ``` public void insert(Rectangle rectangle) throws SQLException { String query = "INSERT INTO rectangles(width, height) VALUES(?, ?)"; PreparedStatement insertStatement = getConnection().prepareStatement(query); insertStatement.setInt(1, rectangle.getWidth()); insertStatement.setInt(2, rectangle.getHeight()); insertStatement.execute(); } ``` --- # RectangleDao - List ``` public List
list() throws SQLException { String query = "SELECT * FROM rectangles"; Statement listStatement = getConnection().createStatement(); ResultSet resultat = listStatement.executeQuery(query); return toRectangleList(resultat); } private List
toRectangleList(ResultSet resultat) throws SQLException { List
list = new ArrayList<>(); 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)); } return list; } ``` --- # RectangleApp ``` public class RectangleApp { public static void main(String[] args) throws SQLException { Scanner scanner = new Scanner(System.in); RectangleDatabase database = new RectangleDatabase(); try(Connection connection = database.connect()) { RectangleDao rectangleDao = new RectangleDao(database); MainMenu menu = new MainMenu(rectangleDao, scanner); menu.draw(); } } } ```