package com.bib.essensbestellungsverwaltung; /* @author Malte Schulze Hobeling */ import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.sql.*; import java.util.ArrayList; import java.util.List; public class Database { private static final String dbLocation = "jdbc:sqlite:"+Path.of("").toAbsolutePath()+"/database.db"; protected static boolean init(){ File db = new File(Path.of("").toAbsolutePath()+"/database.db"); try { return db.createNewFile(); } catch (IOException e) { throw new RuntimeException(e); } } protected static Connection connect(){ Connection conn = null; try{ conn = DriverManager.getConnection(dbLocation); }catch (SQLException e){ e.printStackTrace(); } return conn; } protected static void createDb(){ String[] sql = new String[14]; sql[0] = """ CREATE TABLE IF NOT EXISTS address ( id integer PRIMARY KEY, street text, number text, plz text, city text );"""; sql[1] = """ CREATE TABLE IF NOT EXISTS food_type ( id integer PRIMARY KEY, name text UNIQUE );"""; sql[2] = """ CREATE TABLE IF NOT EXISTS allergy ( id integer PRIMARY KEY, name text UNIQUE );"""; sql[3] = """ CREATE TABLE IF NOT EXISTS severity ( id integer PRIMARY KEY, name text UNIQUE );"""; sql[4] = """ CREATE TABLE IF NOT EXISTS user ( id integer PRIMARY KEY, name text, firstname text, addressid integer, password text, email text UNIQUE, FOREIGN KEY(addressid) REFERENCES address(id) );"""; sql[5] = """ CREATE TABLE IF NOT EXISTS child ( id integer PRIMARY KEY, name text, firstname text, addressid integer, FOREIGN KEY(addressid) REFERENCES address(id) );"""; sql[6] = """ CREATE TABLE IF NOT EXISTS worker ( userid integer PRIMARY KEY, FOREIGN KEY(userid) REFERENCES user(id) );"""; sql[7] = """ CREATE TABLE IF NOT EXISTS parent ( userid integer PRIMARY KEY, FOREIGN KEY(userid) REFERENCES user(id) );"""; sql[8] = """ CREATE TABLE IF NOT EXISTS parent_child ( id integer PRIMARY KEY, parentuserid integer, childid integer, FOREIGN KEY(parentuserid) REFERENCES parent(userid), FOREIGN KEY(childid) REFERENCES child(id) );"""; sql[9] = """ CREATE TABLE IF NOT EXISTS child_allergy ( id integer PRIMARY KEY, childid integer, allergyid integer, severityid integer, FOREIGN KEY(childid) REFERENCES child(id), FOREIGN KEY(allergyid) REFERENCES allergy(id), FOREIGN KEY(severityid) REFERENCES severity(id) );"""; sql[10] = """ CREATE TABLE IF NOT EXISTS food ( id integer PRIMARY KEY, name text UNIQUE, description text, isdessert integer, food_typeid integer, FOREIGN KEY(food_typeid) REFERENCES food_type(id) );"""; sql[11] = """ CREATE TABLE IF NOT EXISTS food_plan ( id integer PRIMARY KEY, date text UNIQUE, food1 integer, food2 integer, dessert1 integer, dessert2 integer, FOREIGN KEY(food1) REFERENCES food(id), FOREIGN KEY(food2) REFERENCES food(id), FOREIGN KEY(dessert1) REFERENCES food(id), FOREIGN KEY(dessert2) REFERENCES food(id) );"""; sql[12] = """ CREATE TABLE IF NOT EXISTS food_restriction ( id integer PRIMARY KEY, foodid integer, allergyid integer, FOREIGN KEY(foodid) REFERENCES food(id), FOREIGN KEY(allergyid) REFERENCES allergy(id) );"""; sql[13] = """ CREATE TABLE IF NOT EXISTS food_selection ( id integer PRIMARY KEY, childid integer, food_planid integer, foodid integer, FOREIGN KEY(childid) REFERENCES child(id), FOREIGN KEY(food_planid) REFERENCES food_plan(id), FOREIGN KEY(foodid) REFERENCES food(id) );"""; try(Connection conn = connect(); Statement stmt = conn.createStatement()){ for(int i = 0; i < sql.length; i++){ stmt.execute(sql[i]); } } catch (SQLException e) { e.printStackTrace(); } } protected static void fillDb(){ List sqls = new ArrayList<>(); sqls.add(""" INSERT OR IGNORE INTO food_type (id,name) VALUES ('1','Vegan');"""); sqls.add(""" INSERT OR IGNORE INTO food_type (id,name) VALUES ('2','Vegetarisch');"""); sqls.add(""" INSERT OR IGNORE INTO food_type (id,name) VALUES ('3','Fleischhaltig');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('1','Eier');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('2','Soja');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('3','Milch');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('4','Erdnüsse');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('5','Weichtiere');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('6','Krebstiere');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('7','Getreide');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('8','Senf');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('9','Sesam');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('10','Schwefeldioxid und Sulfit');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('11','Nüsse');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('12','Sellerie');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('13','Fische');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('14','Lupinen');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('15','Nitrit-Pökelsalz');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('16','Phosphat');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('17','Nitrat');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('18','Antioxidationsmittel');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('19','Farbstoff');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('20','Geschmacksverstärker');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('21','Süßungsmittel');"""); sqls.add(""" INSERT OR IGNORE INTO allergy (id,name) VALUES('22','Konservierungsstoff');"""); sqls.add(""" INSERT OR IGNORE INTO severity (id,name) VALUES('1','Harmlos');"""); sqls.add(""" INSERT OR IGNORE INTO severity (id,name) VALUES('2','Warnung');"""); sqls.add(""" INSERT OR IGNORE INTO severity (id,name) VALUES('3','Kritisch');"""); try(Connection conn = connect(); Statement stmt = conn.createStatement()){ for (String sql : sqls) { stmt.execute(sql); } }catch (SQLException e){ e.printStackTrace(); } } /** * inserts data into table and returns its id * @param table name of the database table * @param header String[] order should match with values * @param values String[] order should match with header * @return id of dataset or -1 */ protected static long insert(String table, String[] header, String[] values){ long id = -1; try (Connection conn = connect()){ String query = queryBuilder("exists",table,header,values); PreparedStatement psQuery = conn.prepareStatement(query); ResultSet rsQuery = psQuery.executeQuery(); if(rsQuery.next()){ boolean found = rsQuery.getBoolean(1); if(!found){ String sql = queryBuilder("insert",table,header,values); String[] rowId = {"id"}; PreparedStatement ps = conn.prepareStatement(sql,rowId); ps.execute(); ResultSet rs = ps.getGeneratedKeys(); if(rs.next()){ id = rs.getLong(1); } }else{ query = queryBuilder("selectMatch",table,header,values); psQuery = conn.prepareStatement(query); rsQuery = psQuery.executeQuery(); if(rsQuery.next()) { id = rsQuery.getLong(1); } } } } catch (SQLException e) { return id; } return id; } protected static long getSingleId(String table, String[] header, String[] values){ long id = -1; try(Connection conn = connect()){ String sql = queryBuilder("selectMatch",table,header,values); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if(rs.next()){ id = rs.getLong(1); if(rs.next()){ id = -1; } } }catch (SQLException e){ e.printStackTrace(); return id; } return id; } protected static void printSampleQuery(){ String sql = """ SELECT * FROM food_type WHERE id > ?;"""; String sql1 = """ SELECT * FROM allergy WHERE id > ?;"""; try(Connection conn = connect()){ PreparedStatement ps = conn.prepareStatement(sql); PreparedStatement ps1 = conn.prepareStatement(sql1); ps.setInt(1,0); ResultSet rs = ps.executeQuery(); System.out.println("food_type"); while (rs.next()){ System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name")); } System.out.println("allergy"); ps1.setInt(1,0); rs = ps1.executeQuery(); while (rs.next()){ System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name")); } }catch (SQLException e){ e.printStackTrace(); } } protected static void delete(String table, long id){ String sql = "DELETE FROM " + table + " WHERE id = ?;"; try(Connection conn = connect();PreparedStatement ps = conn.prepareStatement(sql)){ ps.setLong(1,id); ps.executeUpdate(); }catch (SQLException e){ e.printStackTrace(); } } private static String queryBuilder(String type,String table, String[] header, String[] values){ String sql; StringBuilder sb = new StringBuilder(); switch (type) { case "exists" -> { sb = new StringBuilder("SELECT (count(*) > 0) as found FROM "); sb.append(table); sb.append(" WHERE "); sb.append(header[0]); sb.append(" LIKE '"); sb.append(values[0]); sb.append("'"); for (int i = 1; i < header.length; i++) { sb.append(" AND "); sb.append(header[i]); sb.append(" LIKE '"); sb.append(values[i]); sb.append("'"); } } case "selectMatch" -> { sb = new StringBuilder("SELECT * FROM "); sb.append(table); sb.append(" WHERE "); sb.append(header[0]); sb.append(" LIKE '"); sb.append(values[0]); sb.append("'"); for (int i = 1; i < header.length; i++) { sb.append(" AND "); sb.append(header[i]); sb.append(" LIKE '"); sb.append(values[i]); sb.append("'"); } } case "insert" -> { sb = new StringBuilder("INSERT OR IGNORE INTO "); sb.append(table); sb.append(" ("); sb.append(header[0]); for (int i = 1; i < header.length; i++) { sb.append(","); sb.append(header[i]); } sb.append(") VALUES('"); sb.append(values[0]); sb.append("'"); for (int i = 1; i < values.length; i++) { sb.append(",'"); sb.append(values[i]); sb.append("'"); } sb.append(");"); } } sql = sb.toString(); return sql; } protected static List getTable(String table){ List data = new ArrayList<>(); StringBuilder sb; try(Connection conn = connect()) { String sql = "SELECT * FROM " + table; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); while (rs.next()){ sb = new StringBuilder(); sb.append(rs.getString(1)); for(int i = 2; i <= count; i++){ sb.append(":"); sb.append(rs.getString(i)); } data.add(sb.toString()); } }catch (SQLException e){ return new ArrayList<>(); } return data; } protected static List select(String table,String[] header, String[] values){ List data = new ArrayList<>(); StringBuilder sb; String sql = queryBuilder("selectMatch",table,header,values); try(Connection conn = connect()) { PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); while (rs.next()){ sb = new StringBuilder(); sb.append(rs.getString(1)); for(int i = 2; i <= count; i++){ sb.append(":"); sb.append(rs.getString(i)); } data.add(sb.toString()); } }catch (SQLException e){ e.printStackTrace(); return data; } return data; } protected static List getEntryById(String table, long id){ List data = new ArrayList<>(); StringBuilder sb; String sql = "SELECT * FROM " + table + " WHERE id = ?;"; try (Connection conn = connect()) { PreparedStatement ps = conn.prepareStatement(sql); ps.setLong(1,id); ResultSet rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int count = rsmd.getColumnCount(); while (rs.next()){ sb = new StringBuilder(); sb.append(rs.getString(1)); for(int i = 2; i <= count; i++){ sb.append(":"); sb.append(rs.getString(i)); } data.add(sb.toString()); } } catch (SQLException e) { e.printStackTrace(); return data; } return data; } }