java实现的类和表持久化
//映射的过程:
package com.ly.orm; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; public class ClassMapper { private String[] cols; public String[] getCols() { return cols; } private String schema; private ClassMapper() { } public String getSchema() { return schema; } public static ClassMapper get(Class<?> source, HashMap<String, Class<?>[]> map) { Field[] fs = source.getDeclaredFields(); ArrayList<String> temp = new ArrayList<String>(); StringBuilder sb = new StringBuilder(); for (Field f : fs) {// fuck these endless for and ifelse if (f.getAnnotation(I.class) != null) { continue; } Class<?> cls = f.getType(); for (String key : map.keySet()) { boolean found = false; Class<?>[] classes = map.get(key); for (Class<?> c : classes) { if (!c.equals(cls)) { continue; } found = true; String col, str; C a = f.getAnnotation(C.class); if (a == null || a.getName().length() == 0) { col = f.getName(); } else { col = a.getName(); } str = col + ' ' + key; if (a != null && a.getDesc().length() > 0) { str += ' ' + a.getDesc(); } temp.add(col); sb.append(str + ','); break; } if (found) { break; } } } if (sb.length() == 0) { return null; } sb.setLength(sb.length() - 1); T a = source.getAnnotation(T.class); String t = a == null ? source.getSimpleName() : a.getName(); ClassMapper result = new ClassMapper(); result.schema = String.format("create table %s(%s);", t, sb); result.cols = new String[temp.size()]; temp.toArray(result.cols); return result; } }
//还有三个Annotation:
package com.ly.orm; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /* * 用来标注表。 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface T { String getName(); }
package com.ly.orm; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 可以用来标注字段。 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface C { final static String PRIMARY_KEY = "primary key"; final static String AUTOINCREMENT = "autoincrement"; final static String NOT_NULL = "not null"; final static String DEFAULT_NOW = "default datetime('now','localtime')"; String getName() default ""; String getDesc() default ""; }
package com.ly.orm; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 标注不应被忽略的字段。 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface I { }
//最后测试一下:
import com.ly.orm.C; import com.ly.orm.ClassMapper; import com.ly.orm.I; import com.ly.orm.SQLiteMapper; import com.ly.orm.T; @T(getName = "ggggod") public class God { @C(getDesc = C.PRIMARY_KEY + ' ' + C.AUTOINCREMENT) int a; String aa; @C(getName = "qwe123") public int aaa; @I public String aaaa; public static void main(String[] args) { ClassMapper m = com.ly.orm.ClassMapper.get(God.class, SQLiteMapper.get()); System.out.println(m.getSchema()); } }
//输出结果:
create table ggggod(a integer primary key autoincrement,aa text,qwe123 integer);