JAVA自定义注解[二]

1 篇文章 0 订阅

演示一个自定义注解进行持久层映射案例

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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值