演示一个自定义注解进行持久层映射案例
Exp1: 类名映射
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据库建表:类约束,用于表名
* @author tang
*
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface DBTable {
public String name() default "";
}
Exp2:域映射
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据库建表--域约束
* @author tang
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints {
boolean primaryKey() default false;
boolean allowNull() default true;
boolean unique() default false;
}
Exp3: 字段类型映射--Integer
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据库建表--sql类型--Integer
* @author tang
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLInteger {
String name() default "";
Constraints constraints() default @Constraints;
}
Exp4: 字段类型映射--String
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*数据库建表--sql类型--String类型
*value为sql的列长度
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLString {
int value() default 0;
String name() default "";
Constraints constraints() default @Constraints;
}
public @interface Uniqueness {
Constraints constraints() default @Constraints(unique=true);
}
Exp5:实体类
@DBTable(name="Member")
public class Member {
@SQLString(value=30,constraints=@Constraints(allowNull=false,unique=true))
String firstName;
@SQLString(value=50)
String lastName;
@SQLInteger(constraints=@Constraints(allowNull=false,unique=false))
Integer age;
@SQLString(value=30,constraints=@Constraints(primaryKey=true))
String handle;
static int menberCount;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public Integer getAge() {
return age;
}
public String getHandle() {
return handle;
}
public String toString() {
return handle;
}
}
Exp6:注解解释器
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class TableCreator {
public static void main(String[] args) throws Exception {
tableInfo(Member.class);
}
public static void tableInfo(Class<?> cl) throws Exception {
DBTable dbtable = cl.getAnnotation(DBTable.class);
// 表名,未设置使用类名大写代替
String tableName = dbtable.name();
if (tableName.length() < 1) {
tableName = cl.getName().toUpperCase();
}
// 列信息
List<String> columnDefs = new ArrayList<String>();
StringBuilder createCommand = null;
for (Field field : cl.getDeclaredFields()) {
String columnName = null;
Annotation[] anns = field.getDeclaredAnnotations();
if (anns.length < 1) {
continue;
}
if (anns[0] instanceof SQLInteger) {
SQLInteger sInt = (SQLInteger) anns[0];
if (sInt.name().length() < 1) {
columnName = field.getName().toUpperCase();
} else {
columnName = sInt.name();
}
columnDefs.add(columnName + " INT" + getConstraints(sInt.constraints()));
}
if (anns[0] instanceof SQLString) {
SQLString sString = (SQLString) anns[0];
if (sString.name().length() < 1) {
columnName = field.getName().toUpperCase();
} else {
columnName = sString.name();
}
columnDefs
.add(columnName + " VARCHAR(" + sString.value() + ")" + getConstraints(sString.constraints()));
}
createCommand = new StringBuilder("CREATE TABLE " + tableName + "(");
for (String columnDef : columnDefs) {
createCommand.append("\n " + columnDef + ",");
}
}
String tableCreate = createCommand.substring(0, createCommand.length() - 1) + ");";
System.out.println("Table Creation SQL for Member is :\n" + tableCreate);
}
private static String getConstraints(Constraints con) {
String constraints = "";
if (!con.allowNull()) {
constraints += " NOT NULL";
}
if (con.primaryKey()) {
constraints += " PRIMARY KEY";
}
if (con.unique()) {
constraints += " UNIQUE";
}
return constraints;
}
}
Result:
Table Creation SQL for Member is :
CREATE TABLE Member(
FIRSTNAME VARCHAR(30) NOT NULL UNIQUE,
LASTNAME VARCHAR(50),
AGE INT NOT NULL,
HANDLE VARCHAR(30) PRIMARY KEY);
------------------------------------------------