Преглед изворни кода

Creation class gestion mapping bd -> Object

Arthur Brandao пре 5 година
родитељ
комит
e8ba2b3122
4 измењених фајлова са 114 додато и 140 уклоњено
  1. 1 2
      src/db/Database.java
  2. 5 137
      src/db/Table.java
  3. 107 0
      src/db/mapper/DbMapper.java
  4. 1 1
      src/db/mapper/Mapper.java

+ 1 - 2
src/db/Database.java

@@ -7,8 +7,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.logging.Logger;
 
-import db.table.EspaceTable;
-import entity.Espace;
+import db.mapper.Mapper;
 
 import java.sql.Connection;
 import java.sql.DriverManager;

+ 5 - 137
src/db/Table.java

@@ -14,6 +14,7 @@ import db.annotation.DbField;
 import db.annotation.DbId;
 import db.annotation.DbLink;
 import db.annotation.DbTable;
+import db.mapper.DbMapper;
 
 public abstract class Table<T extends Persistable> {
 	
@@ -174,38 +175,7 @@ public abstract class Table<T extends Persistable> {
 		String sql = "Select * From " + dbTable.name() + " Where " + idField + " = ?";
 		List<Object> params = new ArrayList<>();
 		params.add(id);
-		Optional<T> result = Database.query(sql, params, rs -> {
-			try {
-				T obj = (T) dbTable.entity().getConstructor().newInstance();
-				rs.next();
-				for(Field field : dbTable.entity().getFields()) {
-					if(!field.isAnnotationPresent(DbField.class)) {
-						continue;
-					}
-					// Recup valeur dans le resultat
-					Object value = rs.getObject(field.getAnnotation(DbField.class).value());
-					// Si lien avec une autre entité
-					if(value != null && field.isAnnotationPresent(DbLink.class)) {
-						checkIfPersistable(field);
-						Long otherId = (Long) value;
-						if(otherId == 0) {
-							value = null;
-						} else {
-							String[] split = field.getType().getName().split("\\.");
-							String className = split[split.length - 1];
-							// Chargement de la class Table qui gère l'entité
-							Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).value() + "." + className + "Table");
-							Table table = (Table) clazz.getMethod("getInstance").invoke(null);
-							value = table.getById(otherId);
-						}
-					}
-					field.set(obj, value);
-				}
-				return obj;
-			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
-				throw new IllegalStateException("Unable to map value to the entity");
-			}
-		});
+		Optional<T> result = Database.query(sql, params, DbMapper.objectMapper(dbTable));
 		// Return
 		return result;
 	}
@@ -216,41 +186,7 @@ public abstract class Table<T extends Persistable> {
 		String sql = "Select * From " + dbTable.name() + " Where " + fieldname + " = ?";
 		List<Object> params = new ArrayList<>();
 		params.add(value);
-		Optional<List<T>> result = Database.query(sql, 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;
-						}
-						// Recup valeur dans le resultat
-						Object val = rs.getObject(field.getAnnotation(DbField.class).value());
-						// Si lien avec une autre entité
-						if(val != null && field.isAnnotationPresent(DbLink.class)) {
-							checkIfPersistable(field);
-							Long otherId = (Long) val;
-							if(otherId == 0) {
-								val = null;
-							} else {
-								String[] split = field.getType().getName().split("\\.");
-								String className = split[split.length - 1];
-								// Chargement de la class Table qui gère l'entité
-								Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).value() + "." + className + "Table");
-								Table table = (Table) clazz.getMethod("getInstance").invoke(null);
-								val = table.getById(otherId);
-							}
-						}
-						field.set(obj, val);
-					}
-					list.add(obj);
-				}
-				return list;
-			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
-				throw new IllegalStateException("Unable to map value to the entity");
-			}
-		});
+		Optional<List<T>> result = Database.query(sql, params, DbMapper.listMapper(dbTable));
 		// Return
 		if(result.isPresent()) {
 			return result.get();
@@ -265,41 +201,7 @@ public abstract class Table<T extends Persistable> {
 		sql.append("Select * From " + dbTable.name() + "Where 1=1");
 		where.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;
-						}
-						// Recup valeur dans le resultat
-						Object value = rs.getObject(field.getAnnotation(DbField.class).value());
-						// Si lien avec une autre entité
-						if(value != null && field.isAnnotationPresent(DbLink.class)) {
-							checkIfPersistable(field);
-							Long otherId = (Long) value;
-							if(otherId == 0) {
-								value = null;
-							} else {
-								String[] split = field.getType().getName().split("\\.");
-								String className = split[split.length - 1];
-								// Chargement de la class Table qui gère l'entité
-								Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).value() + "." + className + "Table");
-								Table table = (Table) clazz.getMethod("getInstance").invoke(null);
-								value = table.getById(otherId);
-							}
-						}
-						field.set(obj, value);
-					}
-					list.add(obj);
-				}
-				return list;
-			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
-				throw new IllegalStateException("Unable to map value to the entity");
-			}
-		});
+		Optional<List<T>> result = Database.query(sql.toString(), params, DbMapper.listMapper(dbTable));
 		// Return
 		if(result.isPresent()) {
 			return result.get();
@@ -311,41 +213,7 @@ public abstract class Table<T extends Persistable> {
 		DbTable dbTable = getDbTableAnnotation();
 		// Requete sql
 		String sql = "Select * From " + dbTable.name();
-		Optional<List<T>> result = Database.query(sql, 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;
-						}
-						// Recup valeur dans le resultat
-						Object value = rs.getObject(field.getAnnotation(DbField.class).value());
-						// Si lien avec une autre entité
-						if(value != null && field.isAnnotationPresent(DbLink.class)) {
-							checkIfPersistable(field);
-							Long otherId = (Long) value;
-							if(otherId == 0) {
-								value = null;
-							} else {
-								String[] split = field.getType().getName().split("\\.");
-								String className = split[split.length - 1];
-								// Chargement de la class Table qui gère l'entité
-								Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).value() + "." + className + "Table");
-								Table table = (Table) clazz.getMethod("getInstance").invoke(null);
-								value = table.getById(otherId);
-							}
-						}
-						field.set(obj, value);
-					}
-					list.add(obj);
-				}
-				return list;
-			} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
-				throw new IllegalStateException("Unable to map value to the entity");
-			}
-		});
+		Optional<List<T>> result = Database.query(sql, DbMapper.listMapper(dbTable));
 		// Return
 		if(result.isPresent()) {
 			return result.get();

+ 107 - 0
src/db/mapper/DbMapper.java

@@ -0,0 +1,107 @@
+package db.mapper;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import db.Table;
+import db.annotation.DbField;
+import db.annotation.DbLink;
+import db.annotation.DbTable;
+
+public class DbMapper {
+	
+	public static <T> Mapper<T> objectMapper(DbTable dbTable) {
+		return new Mapper<T>() {	
+			@Override
+			public T map(ResultSet rs) {
+				try {
+					T obj = (T) dbTable.entity().getConstructor().newInstance();
+					rs.next();
+					for(Field field : dbTable.entity().getFields()) {
+						if(!field.isAnnotationPresent(DbField.class)) {
+							continue;
+						}
+						// Recup valeur dans le resultat
+						Object value = rs.getObject(field.getAnnotation(DbField.class).value());
+						// Si lien avec une autre entité
+						if(value != null && field.isAnnotationPresent(DbLink.class)) {
+							checkIfPersistable(field);
+							Long otherId = (Long) value;
+							if(otherId == 0) {
+								value = null;
+							} else {
+								String[] split = field.getType().getName().split("\\.");
+								String className = split[split.length - 1];
+								// Chargement de la class Table qui gère l'entité
+								Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).value() + "." + className + "Table");
+								Table table = (Table) clazz.getMethod("getInstance").invoke(null);
+								value = table.getById(otherId);
+							}
+						}
+						field.set(obj, value);
+					}
+					return obj;
+				} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
+					throw new IllegalStateException("Unable to map value to the entity");
+				}
+				
+			}
+		};
+	}
+	
+	public static <T> Mapper<List<T>> listMapper(DbTable dbTable) {
+		return new Mapper<List<T>>() {	
+			@Override
+			public List<T> map(ResultSet 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;
+							}
+							// Recup valeur dans le resultat
+							Object val = rs.getObject(field.getAnnotation(DbField.class).value());
+							// Si lien avec une autre entité
+							if(val != null && field.isAnnotationPresent(DbLink.class)) {
+								checkIfPersistable(field);
+								Long otherId = (Long) val;
+								if(otherId == 0) {
+									val = null;
+								} else {
+									String[] split = field.getType().getName().split("\\.");
+									String className = split[split.length - 1];
+									// Chargement de la class Table qui gère l'entité
+									Class<?> clazz = Class.forName(field.getAnnotation(DbLink.class).value() + "." + className + "Table");
+									Table table = (Table) clazz.getMethod("getInstance").invoke(null);
+									val = table.getById(otherId);
+								}
+							}
+							field.set(obj, val);
+						}
+						list.add(obj);
+					}
+					return list;
+				} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | SQLException | ClassNotFoundException e) {
+					throw new IllegalStateException("Unable to map value to the entity");
+				}
+			}
+		};
+	}
+	
+	private static void checkIfPersistable(Field f) {
+		boolean ok = false;
+		for(Class<?> clazz : f.getType().getInterfaces()) {
+			ok |= clazz.getName().endsWith("Persistable");
+		}
+		if (!ok) {
+			throw new IllegalStateException("Field object don't implement Persistable");
+		}
+	}
+
+}

+ 1 - 1
src/db/Mapper.java → src/db/mapper/Mapper.java

@@ -1,4 +1,4 @@
-package db;
+package db.mapper;
 
 import java.sql.ResultSet;