From c1093b8ba8f5fda1985fa12755c8e410d532a566 Mon Sep 17 00:00:00 2001 From: Dreampie Date: Mon, 29 Feb 2016 10:42:58 +0800 Subject: [PATCH] add conversion --- .../cn/dreampie/common/entity/Conversion.java | 11 +++++++++++ .../cn/dreampie/common/entity/Entity.java | 17 +++++++++++++++++ .../src/main/java/cn/dreampie/orm/Base.java | 19 ++++++++++++++++++- .../java/cn/dreampie/orm/BaseBuilder.java | 11 ++++++++++- 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 resty-common/src/main/java/cn/dreampie/common/entity/Conversion.java diff --git a/resty-common/src/main/java/cn/dreampie/common/entity/Conversion.java b/resty-common/src/main/java/cn/dreampie/common/entity/Conversion.java new file mode 100644 index 00000000..808c6626 --- /dev/null +++ b/resty-common/src/main/java/cn/dreampie/common/entity/Conversion.java @@ -0,0 +1,11 @@ +package cn.dreampie.common.entity; + +/** + * Created by Dreampie on 16/2/29. + */ +public interface Conversion { + + public Object read(Object v); + + public Object write(Object v); +} diff --git a/resty-common/src/main/java/cn/dreampie/common/entity/Entity.java b/resty-common/src/main/java/cn/dreampie/common/entity/Entity.java index 14076dd8..091a98f0 100644 --- a/resty-common/src/main/java/cn/dreampie/common/entity/Entity.java +++ b/resty-common/src/main/java/cn/dreampie/common/entity/Entity.java @@ -20,6 +20,14 @@ public abstract class Entity { */ private Map modifyAttrs = new CaseInsensitiveMap(); + /** + * get Conversion to convert attr + * + * @param attr + * @return + */ + public abstract Conversion getConversion(String attr); + /** * Return attribute Map. * Danger! The update method will ignore the attribute if you change it directly. @@ -354,6 +362,15 @@ public Object[] getModifyAttrValues(String generatedKey) { if (generatedKey != null && !generatedKey.isEmpty()) { attrValueMap.remove(generatedKey); } + + Conversion conversion; + for (Map.Entry attrValueEntry : attrValueMap.entrySet()) { + conversion = getConversion(attrValueEntry.getKey()); + if (conversion != null) { + attrValueEntry.setValue(conversion.write(attrValueEntry.getValue())); + } + } + Collection attrValueCollection = attrValueMap.values(); return attrValueCollection.toArray(new Object[attrValueCollection.size()]); } diff --git a/resty-orm/src/main/java/cn/dreampie/orm/Base.java b/resty-orm/src/main/java/cn/dreampie/orm/Base.java index e97d6e38..6cb87f2b 100644 --- a/resty-orm/src/main/java/cn/dreampie/orm/Base.java +++ b/resty-orm/src/main/java/cn/dreampie/orm/Base.java @@ -1,5 +1,6 @@ package cn.dreampie.orm; +import cn.dreampie.common.entity.Conversion; import cn.dreampie.common.entity.Entity; import cn.dreampie.common.entity.exception.EntityException; import cn.dreampie.common.util.Joiner; @@ -52,6 +53,10 @@ protected Class getMClass() { } } + public Conversion getConversion(String attr) { + return null; + } + /** * 获取当前实例数据表的元数据 * @@ -764,13 +769,25 @@ public boolean save(List models) { //参数 Object[][] params = new Object[models.size()][columns.length]; + String name; + Object value; + Conversion conversion; + for (int i = 0; i < params.length; i++) { for (int j = 0; j < params[i].length; j++) { //如果是自动生成主键 使用生成器生成 if (!generated && columns[j].equals(generatedKey) && models.get(i).get(generatedKey) == null) { models.get(i).set(columns[j], generator.generateKey()); } - params[i][j] = models.get(i).get(columns[j]); + + name = columns[j]; + value = models.get(i).get(name); + conversion = models.get(i).getConversion(name); + if (conversion != null) { + value = conversion.write(value); + } + + params[i][j] = value; } } diff --git a/resty-orm/src/main/java/cn/dreampie/orm/BaseBuilder.java b/resty-orm/src/main/java/cn/dreampie/orm/BaseBuilder.java index 4130ab17..709ef1b9 100644 --- a/resty-orm/src/main/java/cn/dreampie/orm/BaseBuilder.java +++ b/resty-orm/src/main/java/cn/dreampie/orm/BaseBuilder.java @@ -1,5 +1,7 @@ package cn.dreampie.orm; +import cn.dreampie.common.entity.Conversion; + import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; @@ -21,7 +23,9 @@ public static List build(ResultSet rs, Class modelClass, buildLabelNamesAndTypes(rsmd, labelNames, types); Base entity; + String name; Object value; + Conversion conversion; while (rs.next()) { if (Record.class.isAssignableFrom(modelClass)) { @@ -31,7 +35,12 @@ public static List build(ResultSet rs, Class modelClass, } for (int i = 1; i <= columnCount; i++) { value = rs.getObject(i); - entity.init(labelNames[i], value); + name = labelNames[i]; + conversion = entity.getConversion(name); + if (conversion != null) { + value = conversion.read(value); + } + entity.init(name, value); } result.add((T) entity); }