然后我意识到了,其实有更好的方法来映射一个类到数据库表,上面这个例子很做作。当我们定义了映射到表的类时,我们需要定义一个独立的映射类,但实际上用枚举更好,数据库表中的字段可以是枚举的成员。
例如下面这样写不是更简单吗?
public enum PersonMapping {
personId, firstname, lastname, age;
}
personId, firstname, lastname, age;
}
而且我们可以通过给枚举类型附加一些方法来实现数据库映射的细节:
public enum PersonMapping {
personId("INTEGER", true, false),
firstname("TEXT", false, false),
lastname("TEXT", false, false),
age("INTEGER", false, false);
private PersonMapping(String type, boolean key, boolean nullable )
{
this.type = type;
this.key = key;
this.nullable = nullable;
}
public String getType() {
return type;
}
public boolean isKey() {
return key;
}
public boolean isNullable() {
return nullable;
}
private final String type;
private final boolean key;
private final boolean nullable;
}
personId("INTEGER", true, false),
firstname("TEXT", false, false),
lastname("TEXT", false, false),
age("INTEGER", false, false);
private PersonMapping(String type, boolean key, boolean nullable )
{
this.type = type;
this.key = key;
this.nullable = nullable;
}
public String getType() {
return type;
}
public boolean isKey() {
return key;
}
public boolean isNullable() {
return nullable;
}
private final String type;
private final boolean key;
private final boolean nullable;
}
现在我们可以使用这个枚举来迭代所有字段并创建相应的表:
public String dbTableCreate(String tableName) {
StringBuilder builder = new StringBuilder("Create table ");
builder.append(tableName);
builder.append("(");
for (PersonMapping column : PersonMapping.values()) {
builder.append(column.name());
builder.append(" ");
builder.append(column.getType());
builder.append(column.isKey() ? " primary key" : "");
builder.append(", ");
}
builder = new StringBuilder(builder.substring(0, builder.length() - 2));
builder.append(");");
return builder.toString();
}
StringBuilder builder = new StringBuilder("Create table ");
builder.append(tableName);
builder.append("(");
for (PersonMapping column : PersonMapping.values()) {
builder.append(column.name());
builder.append(" ");
builder.append(column.getType());
builder.append(column.isKey() ? " primary key" : "");
builder.append(", ");
}
builder = new StringBuilder(builder.substring(0, builder.length() - 2));
builder.append(");");
return builder.toString();
}
这个 PersonMapping 枚举类型看起来不错,但是它不允许我们使用不同的类到数据库的映射,因此我们需要抽象,需要接口。从上面的代码看,我们需要枚举类型两个通过的方法:name() 和 values(),第一个方法返回当前枚举值的名字,第二个就是列出所有的枚举值。
首先,我们为枚举添加一个接口:
public enum PersonMapping implements MappingEnum{
....
}
....
}