java 自定义注解解析 模拟Hibernate 的ORM

解析注解

通过反射获取类、函数或者成员运行时的注解信息,从而实现动态控制程序运行的逻辑。

根据imooc网的学习自行整理

1、首先建立JavaBean,如Student.java,Course.java

package com.imooc.sqlann;

@Table("student")
public class Student {
	@Column("stuid")
	private int id;
	@Column("stuname")
	private String name;
	@Column("stuage")
	private int age;
	@Column("stuemail")
	private String email;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
	
	
	
}
package com.imooc.sqlann;

@Table("course")
public class Course {
	@Column("couid")
	private int id;
	@Column("couname")
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	
}

2、因JavaBean中使用了自定义注解,因而需要自行定义Annotation,如Table.java,Column.java

package com.imooc.sqlann;

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();
}
package com.imooc.sqlann;

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

3、创建ParseSQLAnn进行注解解析

3.1 传入参数Object obj

3.2 获取入参的类类型Class

3.3 找到类上的Table注解

3.4 获取字段名与Column列名

3.5 通过invoke反射求出字段值

3.6 拼凑SQL语句

package com.imooc.sqlann;

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

public class ParseSQLAnn {

	public static String query(Object obj){
		StringBuffer sb = new StringBuffer();
		sb.append("select * from ");
		//1、获得obj对应的class
		Class c = obj.getClass();
		//2、找到类上的注解
		boolean isExit;
		isExit = c.isAnnotationPresent(Table.class);
		if(!isExit){
			return null;
		}
		Table tab = (Table) c.getAnnotation(Table.class);
		String tableName = tab.value();
		sb.append(tableName).append(" where 1=1");
		//3、获取字段名
		Field[] fs = c.getDeclaredFields();
		for(Field f : fs){
			isExit = f.isAnnotationPresent(Column.class);
			if(!isExit){
				continue;
			}
			Column col = (Column)f.getAnnotation(Column.class);
			String columnName = col.value();
			String fieldName = f.getName();
			//4、获取字段值,反射机制
			String getName = "get";
			getName = getName + fieldName.substring(0, 1).toUpperCase()
					+ fieldName.substring(1);
			Object fieldValue = null;
			try {
				Method m = c.getMethod(getName);
				fieldValue = m.invoke(obj);
			} catch (Exception e) {
				e.printStackTrace();
			}
			if (fieldValue == null || 
					(fieldValue instanceof Integer && (Integer) fieldValue == 0)) {
				continue;
			}else{
				sb.append(" and ").append(columnName);
				if (fieldValue instanceof String) {
					if(((String) fieldValue).contains(",")){
						String[] ss = ((String) fieldValue).split(",");
						sb.append(" in(");
						for(String s : ss){
							sb.append("'").append(s).append("'").append(",");
						}
						sb.deleteCharAt(sb.length()-1);
						sb.append(")");
 					}else{
						sb.append(" = '").append(fieldValue).append("'");
					}
				} else if (fieldValue instanceof Integer) {
					sb.append(" = ").append((Integer) fieldValue);
				}
			}
		}
		return sb.toString();
		
	}
	
}

4、编写测试类进行测试

package com.imooc.sqlann;

public class SQLTest {

	public static void main(String[] args) {
		Student s1 = new Student();
		s1.setAge(10);
		s1.setName("huxiao");
		
		Student s2 = new Student();
		s2.setName("huda");
		
		Student s3 = new Student();
		s3.setEmail("[email protected],[email protected]");
		
		String sql1 = ParseSQLAnn.query(s1);
		String sql2 = ParseSQLAnn.query(s2);
		String sql3 = ParseSQLAnn.query(s3);
		
		System.out.println(sql1);
		System.out.println(sql2);
		System.out.println(sql3);
		
		Course c1 = new Course();
		c1.setName("Java开发");
		String sql4 = ParseSQLAnn.query(c1);
		System.out.println(sql4);
	}

}

5、结果



猜你喜欢

转载自xucheng271.iteye.com/blog/2281969