zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    Cloudera Manager安装之利用parcels方式安装3或4节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(五)
    Cloudera Manager安装之利用parcels方式安装单节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(四)
    Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式、rpm方式和yum方式)
    Cloudera Manager安装之时间服务器和时间客户端(二)
    Cloudera Manager安装之Cloudera Manager安装前准备(CentOS6.5)(一)
    Cloudera Manager架构原理
    Cloudera Manager是啥?主要是干啥的?
    HDU-1664-Different Digits(BFS)
    AdapterView&lt;?&gt; arg0, View arg1, int arg2, long arg3參数含义
    c++11 新特性之 autokeyword
  • 原文地址:https://www.cnblogs.com/ly45/p/6151545.html
Copyright © 2011-2022 走看看