J2EE之java自定义注解在项目中的使用

J2EE之java自定义注解在项目中的使用

这里写图片描述
这里写图片描述

源代码:

Filter.java:

package com.imooc.test;


@Table("user")//表名
public class Filter {

    @Column("id")//数据名
    private int id;

    @Column("user_name")//数据名
    private String userName;

    @Column("nick_name")//数据名
    private String nickName;

    @Column("age")//数据名
    private int age;

    @Column("city")//数据名
    private String city;

    @Column("email")//数据名
    private String email;

    @Column("mobile")//数据名
    private String mobile;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }


}

Table.java:

package com.imooc.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {

    String value();
}

Column.java:

package com.imooc.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target({ElementType.FIELD})//字段上面
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {

    String value();
}

Test.java:

package com.imooc.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.swing.plaf.basic.BasicBorders.SplitPaneBorder;

public class Test {
    public static void main(String[] args) {
        Filter f1=new Filter();
        f1.setId(10);//查询id为10的用户

        Filter f2=new Filter();
        f2.setUserName("lucy");//模糊查询用户名为lucy的用户
        f2.setId(18);

        Filter f3=new Filter();
        f3.setEmail("liu@sina.com,77777@qq.com");//查询邮箱为其中任意一个的用户

        String sql1=query(f1);
        String sql2=query(f2);
        String sql3=query(f3);

        System.out.println(sql1);
        System.out.println(sql2);
        System.out.println(sql3);
    }

    private static String query(Filter f){
        StringBuffer sb=new StringBuffer();
        //1.获取到class
        Class c=f.getClass();
        //2.获取到table的名字
        boolean exists=c.isAnnotationPresent(Table.class);
        if(!exists){
            return null;
        }
        Table t=(Table)c.getAnnotation(Table.class);
        String tableName=t.value();
        sb.append("select * from").append(tableName).append(" where 1=1");

        //3.遍历所有的字段
        Field[] fArray=c.getDeclaredFields();
        for (Field field : fArray) {
            //4.处理每个字段对应的sql
            //4.1拿到字段名
            boolean fExists=field.isAnnotationPresent(Column.class);
            if(!fExists){
                continue;
            }
            Column column=field.getAnnotation(Column.class);
            String columnName=column.value();
            //4.2拿到字段值
            String fieldName=field.getName();
            String getMethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
            Object fieldValue=null;
            try {
                Method getMethod=c.getMethod(getMethodName);
                fieldValue=getMethod.invoke(f);
            } catch (Exception e) {
                e.printStackTrace();
            }

            //4.3拼装sql
            if(fieldValue==null||(fieldValue instanceof Integer && (Integer)fieldValue==0)){
                continue;
            }
            sb.append(" and ").append(fieldName);
            if(fieldValue instanceof String){
                if(((String) fieldValue).contains(",")){
                    String[] values= ((String)fieldValue).split(",");
                    sb.append(" in(");
                    for (String v : values) {
                        sb.append("'").append(v).append("'").append(",");
                    }
                    sb.deleteCharAt(sb.length()-1);
                    sb.append(")");
                }else{
                    sb.append("=").append("'").append(fieldValue).append("'");
                }

            }else if(fieldValue instanceof Integer){
                sb.append("=").append(fieldValue);
            }

            return sb.toString();
        }

        return null;
    }
}

这里写图片描述