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);
}
}