diff options
-rw-r--r-- | src/main/java/com/iciql/DaoProxy.java | 14 | ||||
-rw-r--r-- | src/main/java/com/iciql/Query.java | 9 | ||||
-rw-r--r-- | src/main/java/com/iciql/SQLDialect.java | 12 | ||||
-rw-r--r-- | src/main/java/com/iciql/SQLDialectDefault.java | 33 | ||||
-rw-r--r-- | src/main/java/com/iciql/SQLDialectH2.java | 2 | ||||
-rw-r--r-- | src/main/java/com/iciql/SQLDialectHSQL.java | 2 | ||||
-rw-r--r-- | src/main/java/com/iciql/SQLDialectMySQL.java | 2 | ||||
-rw-r--r-- | src/main/java/com/iciql/SQLDialectSQLite.java | 9 | ||||
-rw-r--r-- | src/main/java/com/iciql/TableDefinition.java | 13 |
9 files changed, 52 insertions, 44 deletions
diff --git a/src/main/java/com/iciql/DaoProxy.java b/src/main/java/com/iciql/DaoProxy.java index 34187c4..deebeca 100644 --- a/src/main/java/com/iciql/DaoProxy.java +++ b/src/main/java/com/iciql/DaoProxy.java @@ -193,13 +193,18 @@ final class DaoProxy<X extends Dao> implements InvocationHandler, Dao { } else { // query of (array of) standard Java type or a DataTypeAdapter type + if (adapter != null) { + DataTypeAdapter<?> dta = Utils.newObject(adapter); + db.getDialect().registerAdapter(dta); + } + objects = Utils.newArrayList(); ResultSet rs = db.executeQuery(preparedSql.sql, preparedSql.parameters); try { while (rs.next()) { - Object value = db.getDialect().deserialize(rs, 1, returnType, adapter); + Object value = db.getDialect().deserialize(rs, 1, returnType); objects.add(value); if (!isArray) { @@ -683,8 +688,13 @@ final class DaoProxy<X extends Dao> implements InvocationHandler, Dao { typeAdapter = Utils.getDataTypeAdapter(methodArg.getClass().getAnnotations()); } + if (typeAdapter != null) { + DataTypeAdapter<?> dta = Utils.newObject(typeAdapter); + db.getDialect().registerAdapter(dta); + } + // prepare the parameter - parameters[i] = db.getDialect().serialize(value, typeAdapter); + parameters[i] = db.getDialect().serialize(value); } diff --git a/src/main/java/com/iciql/Query.java b/src/main/java/com/iciql/Query.java index d52451e..946a460 100644 --- a/src/main/java/com/iciql/Query.java +++ b/src/main/java/com/iciql/Query.java @@ -423,9 +423,13 @@ public class Query<T> { ResultSet rs = stat.executeQuery();
List<X> result = Utils.newArrayList();
Class<? extends DataTypeAdapter<?>> typeAdapter = Utils.getDataTypeAdapter(x.getClass().getAnnotations());
+ if (typeAdapter != null) {
+ DataTypeAdapter<?> dta = Utils.newObject(typeAdapter);
+ db.getDialect().registerAdapter(dta);
+ }
try {
while (rs.next()) {
- X value = (X) db.getDialect().deserialize(rs, 1, x.getClass(), typeAdapter);
+ X value = (X) db.getDialect().deserialize(rs, 1, x.getClass());
result.add(value);
}
} catch (Exception e) {
@@ -840,8 +844,7 @@ public class Query<T> { stat.addParameter(y);
} else if (col != null) {
// object
- Class<? extends DataTypeAdapter<?>> typeAdapter = col.getFieldDefinition().typeAdapter;
- Object parameter = db.getDialect().serialize(value, typeAdapter);
+ Object parameter = db.getDialect().serialize(value);
stat.addParameter(parameter);
} else {
// primitive
diff --git a/src/main/java/com/iciql/SQLDialect.java b/src/main/java/com/iciql/SQLDialect.java index ccc0452..11b1af8 100644 --- a/src/main/java/com/iciql/SQLDialect.java +++ b/src/main/java/com/iciql/SQLDialect.java @@ -37,21 +37,20 @@ public interface SQLDialect { void registerAdapter(DataTypeAdapter<?> typeAdapter); /** - * Returns the registered instance of the type adapter. + * Returns the registered instance of the type adapter for the specified object class. * - * @param typeAdapter + * @param objectClass * @return the type adapter instance */ - DataTypeAdapter<?> getAdapter(Class<? extends DataTypeAdapter<?>> typeAdapter); + DataTypeAdapter<?> getAdapter(Class<?> objectClass); /** * Serialize the Java object into a type or format that the database will accept. * * @param value - * @param typeAdapter * @return the serialized object */ - <T> Object serialize(T value, Class<? extends DataTypeAdapter<?>> typeAdapter); + <T> Object serialize(T value); /** * Deserialize the object received from the database into a Java type. @@ -59,10 +58,9 @@ public interface SQLDialect { * @param rs * @param columnIndex * @param targetType - * @param typeAdapter * @return the deserialized object */ - Object deserialize(ResultSet rs, int columnIndex, Class<?> targetType, Class<? extends DataTypeAdapter<?>> typeAdapter); + Object deserialize(ResultSet rs, int columnIndex, Class<?> targetType); /** * Configure the dialect. diff --git a/src/main/java/com/iciql/SQLDialectDefault.java b/src/main/java/com/iciql/SQLDialectDefault.java index 8547f3c..7b4852d 100644 --- a/src/main/java/com/iciql/SQLDialectDefault.java +++ b/src/main/java/com/iciql/SQLDialectDefault.java @@ -55,10 +55,10 @@ public class SQLDialectDefault implements SQLDialect { String databaseName; String productVersion; Mode mode; - Map<Class<? extends DataTypeAdapter<?>>, DataTypeAdapter<?>> typeAdapters; + Map<Class<?>, DataTypeAdapter<?>> typeAdapters; public SQLDialectDefault() { - typeAdapters = new ConcurrentHashMap<Class<? extends DataTypeAdapter<?>>, DataTypeAdapter<?>>(); + typeAdapters = new ConcurrentHashMap<Class<?>, DataTypeAdapter<?>>(); } @Override @@ -420,7 +420,7 @@ public class SQLDialectDefault implements SQLDialect { buff.appendExceptFirst(", "); buff.append('?'); Object value = def.getValue(obj, field); - Object parameter = serialize(value, field.typeAdapter); + Object parameter = serialize(value); stat.addParameter(parameter); } buff.append(" FROM "); @@ -432,7 +432,7 @@ public class SQLDialectDefault implements SQLDialect { buff.appendExceptFirst(" AND "); buff.append(MessageFormat.format("{0} = ?", prepareColumnName(field.columnName))); Object value = def.getValue(obj, field); - Object parameter = serialize(value, field.typeAdapter); + Object parameter = serialize(value); stat.addParameter(parameter); } } @@ -452,35 +452,33 @@ public class SQLDialectDefault implements SQLDialect { @Override public void registerAdapter(DataTypeAdapter<?> typeAdapter) { - typeAdapters.put((Class<? extends DataTypeAdapter<?>>) typeAdapter.getClass(), typeAdapter); + typeAdapters.put(typeAdapter.getJavaType(), typeAdapter); } @Override - public DataTypeAdapter<?> getAdapter(Class<? extends DataTypeAdapter<?>> typeAdapter) { - DataTypeAdapter<?> dta = typeAdapters.get(typeAdapter); - if (dta == null) { - dta = Utils.newObject(typeAdapter); - typeAdapters.put(typeAdapter, dta); + public DataTypeAdapter<?> getAdapter(Class<?> objectClass) { + DataTypeAdapter<?> dta = typeAdapters.get(objectClass); + if (dta != null) { + dta.setMode(mode); } - dta.setMode(mode); return dta; } @SuppressWarnings("unchecked") @Override - public <T> Object serialize(T value, Class<? extends DataTypeAdapter<?>> typeAdapter) { - if (typeAdapter == null) { + public <T> Object serialize(T value) { + DataTypeAdapter dta = getAdapter(value.getClass()); + if (dta == null) { // pass-through return value; } - - DataTypeAdapter<T> dta = (DataTypeAdapter<T>) getAdapter(typeAdapter); return dta.serialize(value); } @Override - public Object deserialize(ResultSet rs, int columnIndex, Class<?> targetType, Class<? extends DataTypeAdapter<?>> typeAdapter) { - if (typeAdapter == null) { + public Object deserialize(ResultSet rs, int columnIndex, Class<?> targetType) { + DataTypeAdapter<?> dta = getAdapter(targetType); + if (dta == null) { // standard object deserialization Object value = null; try { @@ -501,7 +499,6 @@ public class SQLDialectDefault implements SQLDialect { return value; } else { // custom object deserialization with a DataTypeAdapter - DataTypeAdapter<?> dta = getAdapter(typeAdapter); Object object = null; try { object = rs.getObject(columnIndex); diff --git a/src/main/java/com/iciql/SQLDialectH2.java b/src/main/java/com/iciql/SQLDialectH2.java index 2d7d0fd..206937c 100644 --- a/src/main/java/com/iciql/SQLDialectH2.java +++ b/src/main/java/com/iciql/SQLDialectH2.java @@ -127,7 +127,7 @@ public class SQLDialectH2 extends SQLDialectDefault { buff.appendExceptFirst(", ");
buff.append('?');
Object value = def.getValue(obj, field);
- Object parameter = serialize(value, field.typeAdapter);
+ Object parameter = serialize(value);
stat.addParameter(parameter);
}
buff.append(')');
diff --git a/src/main/java/com/iciql/SQLDialectHSQL.java b/src/main/java/com/iciql/SQLDialectHSQL.java index 8b05ca4..4425667 100644 --- a/src/main/java/com/iciql/SQLDialectHSQL.java +++ b/src/main/java/com/iciql/SQLDialectHSQL.java @@ -91,7 +91,7 @@ public class SQLDialectHSQL extends SQLDialectDefault { }
buff.append(')');
Object value = def.getValue(obj, field);
- Object parameter = serialize(value, field.typeAdapter);
+ Object parameter = serialize(value);
stat.addParameter(parameter);
}
diff --git a/src/main/java/com/iciql/SQLDialectMySQL.java b/src/main/java/com/iciql/SQLDialectMySQL.java index ec5923f..ea19384 100644 --- a/src/main/java/com/iciql/SQLDialectMySQL.java +++ b/src/main/java/com/iciql/SQLDialectMySQL.java @@ -77,7 +77,7 @@ public class SQLDialectMySQL extends SQLDialectDefault { buff.appendExceptFirst(", ");
buff.append('?');
Object value = def.getValue(obj, field);
- Object parameter = serialize(value, field.typeAdapter);
+ Object parameter = serialize(value);
stat.addParameter(parameter);
}
buff.append(") ON DUPLICATE KEY UPDATE ");
diff --git a/src/main/java/com/iciql/SQLDialectSQLite.java b/src/main/java/com/iciql/SQLDialectSQLite.java index 4777234..28ae852 100644 --- a/src/main/java/com/iciql/SQLDialectSQLite.java +++ b/src/main/java/com/iciql/SQLDialectSQLite.java @@ -22,7 +22,6 @@ import java.sql.SQLException; import java.sql.Time;
import java.sql.Timestamp;
-import com.iciql.Iciql.DataTypeAdapter;
import com.iciql.TableDefinition.FieldDefinition;
import com.iciql.TableDefinition.IndexDefinition;
import com.iciql.util.IciqlLogger;
@@ -135,7 +134,7 @@ public class SQLDialectSQLite extends SQLDialectDefault { buff.appendExceptFirst(", ");
buff.append('?');
Object value = def.getValue(obj, field);
- Object parameter = serialize(value, field.typeAdapter);
+ Object parameter = serialize(value);
stat.addParameter(parameter);
}
buff.append(')');
@@ -143,11 +142,11 @@ public class SQLDialectSQLite extends SQLDialectDefault { }
@Override
- public Object deserialize(ResultSet rs, int columnIndex, Class<?> targetType, Class<? extends DataTypeAdapter<?>> typeAdapter) {
+ public Object deserialize(ResultSet rs, int columnIndex, Class<?> targetType) {
try {
- return super.deserialize(rs, columnIndex, targetType, typeAdapter);
+ return super.deserialize(rs, columnIndex, targetType);
} catch (IciqlException e) {
- if (typeAdapter == null && e.getMessage().startsWith("Can not convert")) {
+ if (e.getMessage().startsWith("Can not convert")) {
try {
// give the SQLite JDBC driver an opportunity to deserialize DateTime objects
if (Timestamp.class.equals(targetType)) {
diff --git a/src/main/java/com/iciql/TableDefinition.java b/src/main/java/com/iciql/TableDefinition.java index 8248f18..6ed9462 100644 --- a/src/main/java/com/iciql/TableDefinition.java +++ b/src/main/java/com/iciql/TableDefinition.java @@ -475,8 +475,9 @@ public class TableDefinition<T> { } if (typeAdapter != null) { - DataTypeAdapter<?> dtt = db.getDialect().getAdapter(typeAdapter); - dataType = dtt.getDataType(); + DataTypeAdapter<?> dta = Utils.newObject(typeAdapter); + dataType = dta.getDataType(); + db.getDialect().registerAdapter(dta); } boolean hasAnnotation = f.isAnnotationPresent(IQColumn.class); @@ -673,7 +674,7 @@ public class TableDefinition<T> { // try to interpret and instantiate a default value value = ModelUtils.getDefaultValue(field, db.getDialect().getDateTimeClass()); } - Object parameter = db.getDialect().serialize(value, field.typeAdapter); + Object parameter = db.getDialect().serialize(value); stat.addParameter(parameter); } buff.append(')'); @@ -709,7 +710,7 @@ public class TableDefinition<T> { // try to interpret and instantiate a default value value = ModelUtils.getDefaultValue(field, db.getDialect().getDateTimeClass()); } - Object parameter = db.getDialect().serialize(value, field.typeAdapter); + Object parameter = db.getDialect().serialize(value); stat.addParameter(parameter); } buff.append(')'); @@ -784,7 +785,7 @@ public class TableDefinition<T> { buff.appendExceptFirst(", "); buff.append(db.getDialect().prepareColumnName(field.columnName)); buff.append(" = ?"); - Object parameter = db.getDialect().serialize(value, field.typeAdapter); + Object parameter = db.getDialect().serialize(value); stat.addParameter(parameter); } } @@ -1177,7 +1178,7 @@ public class TableDefinition<T> { } o = Utils.convertEnum(obj, targetType, def.enumType); } else { - o = dialect.deserialize(rs, columns[i], targetType, def.typeAdapter); + o = dialect.deserialize(rs, columns[i], targetType); } def.setValue(item, o); } |