Java注解使用示例

涉及到的类

  • Filter.java 该类为一个JavaBean,有属性id,name,age,sex······
  • Column.java 该类为一个注解,对应数据库的表的列名
  • Table.java 该类为一个注解,对应数据库的表的名字
  • Test.java 测试类,有一个主函数入口,还有一个query函数,拼接sql语句,模仿从数据库获取信息

Filter类在声明时加上注解 @Table(“对应数据库名”) ,并且每个自己声明的私有变量在声明时加上注解 @Column(“对应数据列名”),还有一些 getter/setter 方法

query(Object obj) 方法(主要思路是通过注解获取成员变量的名字,然后通过方法反射获取成员变量的属性值)
先讲一些方法的作用

Class c = obj.getClass(); // 获取obj对象的类类型
c.getDeclaredFields()  // 获取obj对象的类中自己声明成员变量
c.isAnnotationPresent(Table.class) // 判断c类的 Table 注解是否存在
(Table)c.getAnnotation(Table.class) // 获取 Table 注解
String tableName = table.value(); // 获取注解的值

先获取obj对象的类类型,然后判断注解是否存在,存在了就获取注解的值(表名,或者列名)。然后加上 ‘get’, 把注解值的第一个字母变成大写,就变成Fileter相应的getter方法,通过方法反射来获取成员变量的值。剩下的就是拼接sql语句

Filter.java

package com.immoc.test;

@Table("user")
public class Filter {
	
	@Column("id")
	private int id;
	
	@Column("userName")
	private String userName;

	@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 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.immoc.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.immoc.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.immoc.test;

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

public class Test {

	public static void main(String[] args) {
		Filter f1 = new Filter();
		f1.setId(10);
		
		Filter f2 = new Filter();
		f2.setUserName("张三");
		f2.setCity("成都");
		
		Filter f3 = new Filter();
		f3.setEmail("[email protected],[email protected],[email protected]");
		
		System.out.println(query(f1));
		System.out.println(query(f2));
		System.out.println(query(f3));
	}
	
	/**
	 * 拼装sql语句
	 * @param obj 过滤条件的对象
	 * @return
	 */
	public static String query(Object obj) {
		StringBuilder sBuilder = new StringBuilder();
		// 获取obj对象的类的类类型
		Class c = obj.getClass();
		// 遍历所有的字段
		Field []fields = c.getDeclaredFields();
		// 获取表名
		if(!c.isAnnotationPresent(Table.class)) {
			return null;
		}
		Table table = (Table)c.getAnnotation(Table.class);
		String tableName = table.value(); // 获取注解的值
		sBuilder.append(" select * from ").append(tableName).append(" where 1=1 ");
		for (Field field : fields) {
			// 拼装字段对应的sql语句
			if(!field.isAnnotationPresent(Column.class)) {
				continue;
			}
			// 获取字段名
			Column column = (Column)field.getAnnotation(Column.class);
			String fieldName = column.value();
			// 获取字段值
			String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase()
					+ fieldName.substring(1);
			Object fieldValue = null;
			try {
				Method method = c.getMethod(getMethodName);
				fieldValue = method.invoke(obj);
			} catch (Exception e) {
				e.printStackTrace();
			} 
			// 拼装sql语句
			// 字段值为空则排除
			if(fieldValue==null || 
					((fieldValue instanceof Integer) && (Integer)fieldValue==0)) {
				continue;
			}
			sBuilder.append(" and ").append(fieldName);
			if(fieldValue instanceof String) {
				if(((String)fieldValue).contains(",")) {
					String[] values = ((String) fieldValue).split(",");
					sBuilder.append(" in( ");
					for (String v : values) {
						sBuilder.append("'").append(v).append("', ");
					}
					// 将最后一个逗号去掉
					sBuilder.deleteCharAt(sBuilder.length()-2);
					sBuilder.append(")");
				}else {
					sBuilder.append(" = ").append("'").append(fieldValue).append("'");
				}
			}else if(fieldValue instanceof Integer) {
				sBuilder.append(" = ").append(fieldValue);
			}
		}
		return sBuilder.toString();
	}
}

猜你喜欢

转载自blog.csdn.net/innocent_jia/article/details/89039827