カスタムコメントを使って簡単なフレームを作ります。

3953 ワード

本文ではJava運転時のレベルの注釈と配合反射をどのように使用してフレームを構築するかを紹介します。以下はsqlテーブルを構築する簡単な例です。運行時のフレームを構築する方法を説明します。
1.2つの運転時の注釈を定義し、それぞれクラスとフィールドがテーブル名と列名を表します。
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String name();
}

@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String name();
}
2.記憶列を定義するモデルNameAndType
public class NameAndType {

private String name;

private String type;

public NameAndType()
{
}

public NameAndType(String type, String name)
{
this.type = type;
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}
}
3.javabeaとデータベースの関係マップを定義する
@Table(name="BeanTable")
public class Bean {

@Column(name="field") // @Colomn
int field;
@Column(name="description")
String description;
}
4.反射定義ツール類により、動的取得テーブル名を定義し、列関連情報と組立SQLを取得する
public class Utils {
private static String getTableName(Class> clazz)
{
String name = null;
if(clazz.isAnnotationPresent(Table.class))
{
Table table = clazz.getAnnotation(Table.class);
name = table.name();
}
return name;
}
private static List getColumns(Class> clazz)
{
List list = new ArrayList<>();
Field[] fields = clazz.getDeclaredFields();
if(fields != null)
{
for(Field field : fields)
{
if(field.isAnnotationPresent(Column.class))
{
Column column = field.getAnnotation(Column.class);
String name = column.name();
String type = null;
if(int.class.isAssignableFrom(field.getType()))
{
type = "integer";
}
else if(String.class.isAssignableFrom(field.getType()))
{
type = "text";
}
else
{
throw new RuntimeException("unsupport type :" + field.getType().getSimpleName());
}

list.add(new NameAndType(type, name));

}
}
}
return list;
}


public static String createTable(Class> bean) {
String tableName = getTableName(bean);
List columns = getColumns(bean);
if (tableName != null && !tableName.equals("") && !columns.isEmpty()) {
StringBuilder createTableSql = new StringBuilder("create table ");
//
createTableSql.append(tableName);
createTableSql.append("(");

//
for (int i = 0; i < columns.size(); i++) {
NameAndType column = columns.get(i);
createTableSql.append(column.getName());
createTableSql.append(" ");
createTableSql.append(column.getType());
//
if (i != columns.size() - 1) {
createTableSql.append(",");
}
}
createTableSql.append(")");
return createTableSql.toString();
}

return null;
}
}

public class Test {

public static void main(String[] args)
{
System.out.println(Utils.createTable(Bean.class));
}
}


---運転結果は以下の通りです。
create table BeanTable(field integer,description text)