[[oktatas:programozas:java:java adatbázis|< Java adatbázis]] ====== Interfész használata ====== * **Szerző:** Sallai András * Copyright (c) 2020, Sallai András * Szerkesztve: 2020, 2022 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== Az interfész lehetővé teszi, hogy **ahol** az adatokat **felhasználjuk**, **ott döntsük** el, melyik adatbázist használjuk. Az alábbi példában **App** osztályban példányosítjuk a **Data** osztályt, ahol a konstruktor számára átadunk egy olyan osztályt, amely implementálja a **iDatabase** interfészt. Az iDatabase interfészt az **Sqlite** és **Mariadb** osztály implementálja. Ezek adhatók meg paraméternek. A "**new Sqlite()**" esetén az adatok SQLite adatbázisban tárolódnak. A "**new Mariadb()**" esetén az adatok MariaDB adatbázisban tárolódnak. {{:oktatas:programozas:java:java_adatbazis:interfesz_hasznalata.png|}} {{:oktatas:programozas:java:java_adatbazis:interfesz_hasznalat_uml_v2.png|}} ===== Adatbázis ===== create database surubt character set utf8 collate utf8_hungarian_ci; grant all privileges on surubt.* to surubt@localhost identified by 'titok'; use surubt; create table employees ( id int not null primary key auto_increment, name varchar(50), city varchar(50), salary double ); create table employees ( id integer not null primary key autoincrement, name text, city text, salary real ); insert into employees (name, city, salary) values ("Para Béla", "Szolnok", 347), ("Csend Irén", "Szeged", 342); ===== Employee ===== public class Employee { int id; String name; String city; double salary; } ===== DatabaseConnection Interfész ===== Írjuk le, milyen metódusokra van szükség az adatbázis elérése során: import java.sql.Connection; public interface DatabaseConnection { public Connection connectDb(); public void closeDb(Connection conn); } ===== MariadbConnection ===== A MariaDB használata: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class MariadbConnection implements DatabaseConnection { private Connection tryConnectDb() throws SQLException { String url = "jdbc:mariadb://localhost:3306/surubt"; return DriverManager.getConnection(url, "surubt", "titok"); } public Connection connectDb(){ Connection conn = null; try { conn = tryConnectDb(); }catch(SQLException e) { System.err.println("Hiba! A kapcsolódás sikertelen"); System.err.println(e.getMessage()); } return conn; } private void tryCloseDb(Connection conn) throws SQLException { conn.close(); } public void closeDb(Connection conn){ try { tryCloseDb(conn); }catch(SQLException e) { System.err.println("Hiba! A kapcsolat zárása sikertelen!"); System.err.println(e.getMessage()); } } } ===== SqliteConnection ===== import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SqliteConnection implements DatabaseConnection { public Connection tryConnectDb() throws SQLException { String url = "jdbc:sqlite:surubt.sqlite"; return DriverManager.getConnection(url); } public Connection connectDb() { Connection conn = null; try { conn = tryConnectDb(); }catch(SQLException ex) { System.err.println("Hiba! A kapcsolódás sikertelen!"); } return conn; } public void tryCloseDb(Connection conn) throws SQLException { conn.close(); } public void closeDb(Connection conn) { try { tryCloseDb(conn); } catch (SQLException ex) { System.err.println("Hiba! A bezárás sikertelen!"); } } } A surubt.sqlite fájlnak a projekt gyökérkönyvtárában a helye. ===== DataService ===== import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class DataService { DatabaseConnection database; public DataService(DatabaseConnection database) { this.database = database; } public List getEmployees() { List employee = new ArrayList<>(); try { employee = tryGetEmployees(); }catch(SQLException e) { System.err.println("Hiba! A lekérdezés sikertelen!"); System.err.println(e.getMessage()); } return employee; } public List tryGetEmployees() throws SQLException { List employees = new ArrayList<>(); String sql = "select id, name, city, salary from employees"; Connection conn = database.connectDb(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while(rs.next()) { Employee employee = new Employee(); employee.id = rs.getInt("id"); employee.name = rs.getString("name"); employee.city = rs.getString("city"); employee.salary = rs.getDouble("salary"); employees.add(employee); } database.closeDb(conn); return employees; } public void tryInsertEmployee(String name, String city) throws SQLException { Connection conn = database.connectDb(); String sql = "insert into employees " + "(name, city) values " + "(?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); pstmt.setString(2, city); pstmt.execute(); database.closeDb(conn); } public void insertEmployee(String name, String city) { try { tryInsertEmployee(name, city); } catch (SQLException ex) { System.err.println("Hiba! A beszúrás sikertelen!"); } } } ===== App ===== import java.util.ArrayList; import java.util.List; public class App { public static void main(String[] args) { List employees = new ArrayList<>(); DataService data = new DataService(new MariadbConnection()); employees = data.getEmployees(); for(Employee employee : employees) { System.out.println(employee.name); } data.insertEmployee("Park Elemér", "Szolnok"); } }