自定义注解(2)—定义和使用(利用反射获取)

来源:互联网 发布:网络错误代码1004 编辑:程序博客网 时间:2024/05/22 13:05

实现功能:

使用自定义注解自动生成SQL语句

自定义Table注解

package com.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * @author Duoduo * @version 1.0 * @date 2017/5/14 15:14 */@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Table {    String name();}

自定义Column注解

package com.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * @author Duoduo * @version 1.0 * @date 2017/5/14 15:31 */@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface Column {    String name();    String type();    int length();}

使用自定义注解注解

package com.annotation;/** * @author Duoduo * @version 1.0 * @date 2017/5/15 14:42 */@Table(name = "sys_user")public class User {    @Column(name = "username",type = "varchar", length = 30)    private  String username;    @Column(name = "password",type = "varchar", length = 30)    private  String  password;}

利用反射机制获取注解信息生成SQL

使用函数getAnnotation来获取注解信息。
例如:
- 获取类上的注解函数 Table table = (Table) clazz.getAnnotation(Table.class);
- 获取字段上的注解函数 (Column) field.getAnnotation(Column.class);

package com.annotation;import java.lang.reflect.Field;/** * @author Duoduo * @version 1.0 * @date 2017/5/15 14:52 */public class GenerateSql {    private Class<?> clazz;    public GenerateSql(Class<?> clazz) {        this.clazz = clazz;    }    /**     * 生成创建表脚本的sql     *     * @return     */    public String createTable() {        String tableName = getTableName();        StringBuffer sql = new StringBuffer();        sql.append("Create Table " + tableName + " (").append("\n");        Field[] fields = clazz.getDeclaredFields();        for (Field field : fields) {            Column column = getColumn(field);            sql.append("  " + column.name() + " " + column.type() + "(" + column.length() + ")" + ",\n");        }        sql.append(");");        return sql.toString();    }    public String getSelectAll() {        StringBuffer sql = new StringBuffer();        String tableName = getTableName();        sql.append("Select ");        Field[] fields = getAllColumn();        int length = fields.length;        for (int i = 0; i < length; i++) {            Column column = getColumn(fields[i]);            if (i == length - 1) {                sql.append(column.name());            } else {                sql.append(column.name() + ", ");            }        }        sql.append(" From " + tableName);        return sql.toString();    }    /**     * 根据类上的Table 注解获取表的名称     *     * @return     */    private String getTableName() {        Table table = (Table) clazz.getAnnotation(Table.class);        return table.name();    }    /**     * 获取字段中的注解     *     * @param field     * @return     */    private Column getColumn(Field field) {        return (Column) field.getAnnotation(Column.class);    }    /**     * 获取类所有的列     *     * @return     */    private Field[] getAllColumn() {        return clazz.getDeclaredFields();    }}

测试类

package com.annotation;/** * @author Duoduo * @version 1.0 * @date 2017/5/15 14:45 */public class Test2 {    public static void main(String[] args) {        GenerateSql generateSql = new GenerateSql(User.class);        System.out.println(generateSql.createTable());        System.out.println(generateSql.getSelectAll());    }}

测试结果

Create Table sys_user (  username varchar(30),  password varchar(30),);Select username, password From sys_user
0 0