-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSQLMapper.java
More file actions
108 lines (97 loc) · 4.09 KB
/
Copy pathSQLMapper.java
File metadata and controls
108 lines (97 loc) · 4.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package org.javawebstack.orm;
import org.javawebstack.orm.exception.ORMQueryException;
import org.javawebstack.orm.mapper.DefaultMapper;
import org.javawebstack.orm.mapper.TypeMapper;
import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SQLMapper {
public static <T extends Model> Map<String, Object> map(Repo<T> repo, T entity) {
Map<String, Object> values = new HashMap<>();
for (String fieldName : repo.getInfo().getFields())
values.put(repo.getInfo().getColumnName(fieldName), getValue(repo, fieldName, entity));
return values;
}
public static <T extends Model> List<T> map(Repo<T> repo, ResultSet rs, List<Class<? extends Model>> joinedModels) {
List<T> list = new ArrayList<>();
try {
while (rs.next()) {
T t = (T) repo.getInfo().getModelConstructor().newInstance();
for (Class<? extends Model> model : joinedModels) {
Repo<Model> r = Repo.get((Class<Model>) model);
Model o = (Model) r.getInfo().getModelConstructor().newInstance();
t.internalAddJoinedModel(model, mapBack(r, rs, o));
}
list.add(mapBack(repo, rs, t));
}
} catch (SQLException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
throw new ORMQueryException(ex);
}
return list;
}
public static <T extends Model> T mapBack(Repo<T> repo, ResultSet rs, T t) {
t.setEntryExists(true);
for (String fieldName : repo.getInfo().getFields()) {
Object value = getValue(rs, repo.getInfo().getType(fieldName).getJavaType(), repo.getInfo().getTableName(), repo.getInfo().getColumnName(fieldName));
setValue(repo, fieldName, t, value);
}
t.updateOriginal();
return t;
}
public static List<Object> mapParams(Repo<?> repo, List<Object> params) {
List<Object> result = new ArrayList<>();
for (Object o : params) {
if (o == null) {
result.add(null);
continue;
}
TypeMapper mapper = repo.getInfo().getConfig().getTypeMapper(o.getClass(), 0);
if (mapper == null) {
result.add(o);
continue;
}
result.add(mapper.mapToSQL(o, o.getClass()));
}
return result;
}
private static <T extends Model> Object getValue(Repo<T> repo, String fieldName, T entry) {
try {
Object value = repo.getInfo().getField(fieldName).get(entry);
for (TypeMapper mapper : repo.getInfo().getConfig().getTypeMappers())
value = mapper.mapToSQL(value, repo.getInfo().getField(fieldName).getType());
return value;
} catch (IllegalAccessException e) {
throw new ORMQueryException(e);
}
}
private static Object getValue(ResultSet rs, Class<?> sqlType, String tableName, String columnName) {
try {
try {
rs.findColumn(columnName);
} catch (SQLException ex) {
columnName = tableName + "." + columnName;
}
try {
rs.findColumn(columnName);
} catch (SQLException ex) {
return null;
}
return rs.getObject(columnName, DefaultMapper.TYPE_MAPPING);
} catch (SQLException e) {
throw new ORMQueryException(e);
}
}
private static <T extends Model> void setValue(Repo<T> repo, String fieldName, T entry, Object value) {
try {
for (TypeMapper mapper : repo.getInfo().getConfig().getTypeMappers())
value = mapper.mapToJava(value, repo.getInfo().getField(fieldName).getType());
repo.getInfo().getField(fieldName).set(entry, value);
} catch (IllegalAccessException e) {
throw new ORMQueryException(e);
}
}
}