JAva注釈小例


注釈でエンティティクラス対応テーブルのSQL文を生成したいです.したがって、SQLを生成するエンティティ・クラスを表すTableと、テーブルにマッピングするフィールドを識別するColumnの2つの注釈クラスが書かれています.単純なエンティティークラスUserと注記のツールクラスGenerateTableUtil.コードは注釈をもっと理解するためだけです.だから注釈を処理するツール類GenerateTableUtilは非常に不完全で、興味があれば注釈ツール類を改善してみんなに共有することができます.
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value() default "";
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    //       ,   value。            @Column("id")    ,        id  @Column(id="id")
    //      default     ,       ,                    value  
    String value() default "";
}
@Table
public class User {
    
    @Column
    private int id;
    
    @Column
    private String name;
    
    @Column
    private String phone;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    
}
import java.lang.reflect.Field;
import java.sql.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class GenerateTableUtil {
    public static void generateSQL(Class<?> clazz)
    {
        Table tableAnnotation = null;
        if(clazz.isAnnotationPresent(Table.class))//       Table  
          tableAnnotation = clazz.getAnnotation(Table.class);
        else
            return;
        String tableName = tableAnnotation.value();
        if(null ==tableName || tableName.length()==0)
            tableName = clazz.getSimpleName().toUpperCase();
        
        Field[] fields = clazz.getDeclaredFields();
        Map<String,String> cols = new HashMap<String,String>();
        //   Column     ,              
        for(Field field:fields)
        {
            Column columnAnnotation = null;
            if(field.isAnnotationPresent(Column.class))
             {
                columnAnnotation = field.getAnnotation(Column.class);
                String colName = columnAnnotation.value();
                if(null == colName || colName.length()==0)
                    colName = field.getName().toUpperCase();
                Class<?> type = field.getType();
                String jdbcType = "VARCHAR(20)";
                try {
                  //           ,           。                      
                    jdbcType = getJdbcType(type);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                cols.put(colName, jdbcType);
             }
        }
        System.out.println(joinSQL(tableName,cols));
    }
    
    /**
     *            ,       
     * @param type java    class
     * @return       
     * @throws Exception          
     */
    private static String getJdbcType(Class<?> type) throws Exception
    {
        if(type.isAssignableFrom(int.class)||type.isAssignableFrom(Integer.class))
            return "INT";
        if(type.isAssignableFrom(String.class))
            return "VARCHAR(20)"; //           20,       
        if(type.isAssignableFrom(char.class))
            return "CHAR(20)";
        if(type.isAssignableFrom(Date.class))
            return "DATETIME";
        if(type.isAssignableFrom(long.class)||type.isAssignableFrom(Long.class))
            return "BIGINT";
        if(type.isAssignableFrom(float.class)||type.isAssignableFrom(Float.class))
            return "FLOAT";
        if(type.isAssignableFrom(double.class)||type.isAssignableFrom(Double.class))
            return "DOUBLE";
        else
            throw new Exception("       ");
    }
    
    /**
     *          SQL  
     * @param tableName
     * @param fields
     * @return
     */
    private static String joinSQL(String tableName,Map<String,String> fields)
    {
        StringBuffer sb = new StringBuffer("CREATE TABLE ");
        sb.append(tableName);
        sb.append('(');
        Set<Entry<String,String>> entrySet = fields.entrySet();
        for(Entry<String, String> entry:entrySet)
        {
            sb.append(entry.getKey());
            sb.append(" ");
            sb.append(entry.getValue());
            sb.append(',');
        }
        sb.replace(sb.length()-1, sb.length(), ")");
        return sb.toString();
    }
    public static void main(String[] args) {
        generateSQL(User.class);
    }
}