Browse Source

Fin gestion BDD

Arthur Brandao 5 years ago
parent
commit
a511735702
3 changed files with 70 additions and 10 deletions
  1. 0 2
      src/db/Database.java
  2. 69 5
      src/db/Table.java
  3. 1 3
      src/servlets/TestDb.java

+ 0 - 2
src/db/Database.java

@@ -1,7 +1,6 @@
 package db;
 
 import java.sql.Statement;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -15,7 +14,6 @@ import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 
 public class Database {

+ 69 - 5
src/db/Table.java

@@ -4,12 +4,10 @@ import java.util.List;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
-import java.math.BigInteger;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Optional;
 
 import db.annotation.DbField;
@@ -45,8 +43,10 @@ public abstract class Table<T extends Persistable> {
 		return list;
 	}
 	
-	public List<T> getWhere() {
-		return null;
+	public List<T> getWhere(List<String> where, List<Object> params) {
+		List<T> list = getWhereFromDb(where, params);
+		list.forEach(elt -> cache(elt));
+		return list;
 	}
 	
 	public List<T> getAll() {
@@ -82,7 +82,33 @@ public abstract class Table<T extends Persistable> {
 	}
 	
 	public final void delete(long id) {
-		
+		DbTable dbTable = getDbTableAnnotation();
+		// Cherche l'id
+		String idField = null;
+		for(Field field : dbTable.entity().getFields()) {
+			if(!field.isAnnotationPresent(DbId.class)) {
+				continue;
+			}
+			// Lecture du nom de l'id dans la base
+			if(field.isAnnotationPresent(DbField.class)) {
+				idField = field.getAnnotation(DbField.class).name();
+			} else {
+				throw new IllegalStateException("Unable to find DbField annotation on id");
+			}
+		}
+		if (idField == null) {
+			throw new IllegalStateException("Unable to find find DbField annotation");
+		}
+		// Requete SQL
+		String sql = "Delete From " + dbTable.name() + " Where " + idField + " = ?";
+		List<Object> params = new ArrayList<>();
+		params.add(id);
+		// Execution requete
+		if (!Database.execute(sql, params)) {
+			throw new IllegalStateException("Unable to delete data");
+		}
+		// Retire du cache
+		remove(id);
 	}
 	
 	public void delete(T obj) {
@@ -99,6 +125,12 @@ public abstract class Table<T extends Persistable> {
 		//cacheMap.forEach((key, val) -> System.out.println("Cache: " + key));
 	}
 	
+	private void remove(long id) {
+		if (cacheMap.containsKey(id)) {
+			cacheMap.remove(id);
+		}
+	}
+	
 	private DbTable getDbTableAnnotation() {
 		Class<?> clazz = this.getClass();
 		// Recupération info anotation DbTable
@@ -180,6 +212,38 @@ public abstract class Table<T extends Persistable> {
 		return result.get();
 	}
 	
+	private List<T> getWhereFromDb(List<String> fields, List<Object> params) {
+		DbTable dbTable = getDbTableAnnotation();
+		// Requete sql
+		StringBuilder sql = new StringBuilder();
+		sql.append("Select * From " + dbTable.name() + "Where 1=1");
+		fields.forEach(elt -> sql.append(" And elt  = ?"));
+		// Execution requete
+		Optional<List<T>> result = Database.query(sql.toString(), params, rs -> {
+			try {
+				List<T> list = new ArrayList<>();
+				while(rs.next()) {
+					T obj = (T) dbTable.entity().getConstructor().newInstance();
+					for(Field field : dbTable.entity().getFields()) {
+						if(!field.isAnnotationPresent(DbField.class)) {
+							continue;
+						}
+						obj.getClass().getField(field.getName()).set(obj, rs.getObject(field.getAnnotation(DbField.class).name()));
+					}
+					list.add(obj);
+				}
+				return list;
+			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException | SQLException e) {
+				throw new IllegalStateException("Unable to map value to the entity");
+			}
+		});
+		// Return
+		if(result.isEmpty()) {
+			return new ArrayList<>();
+		}
+		return result.get();
+	}
+	
 	private List<T> getAllFromDb() {
 		DbTable dbTable = getDbTableAnnotation();
 		// Requete sql

+ 1 - 3
src/servlets/TestDb.java

@@ -39,9 +39,7 @@ public class TestDb extends HttpServlet {
 		List<Espace> e = et.getAll();
 		System.out.println(e.size());
 		e.forEach(elt -> System.out.println(elt.id + " " + elt.libelle));
-		Espace ee = et.getById(1);
-		ee.libelle = "Hello";
-		et.save(ee);
+		et.delete(2);
 		e = et.getAll();
 		System.out.println(e.size());
 		e.forEach(elt -> System.out.println(elt.id + " " + elt.libelle));