Java之——注解详解和自定义注解(模拟实现Hibernate的注解生成SQL语句)

转载请注明出处:https://blog.csdn.net/l1028386804/article/details/80275680

Java自定义注解的理论部分参见博文《Java之——注解详解和自定义注解(基于JDK实现简单的注解功能)》,我们直接进入主题

1、实现Table注解

package io.mykit.annotation.jdk.db.provider;

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

/**
 * 自定义Table注解
 * @author liuyazhuang
 *
 */
@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Table {
	String value() default "";
}

2、实现Colume注解

package io.mykit.annotation.jdk.db.provider;

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

/**
 * 自定义Column注解
 * @author liuyazhuang
 *
 */
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
	String value() default "";
}

3、创建使用注解的类User

package io.mykit.annotation.jdk.db.provider.entity;

import io.mykit.annotation.jdk.db.provider.Column;
import io.mykit.annotation.jdk.db.provider.Table;

/**
 * 自定义使用注解的实体
 * @author liuyazhuang
 *
 */
@Table("t_user")
public class User {
	
	@Column("id")
	private String id;
	
	@Column("name")
	private String name;

	public User() {
		super();
	}

	public User(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public String getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + "]";
	}
	
}

4、实现的注解解析类AnnotationParser

package io.mykit.annotation.jdk.db.provider.parser;

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

import io.mykit.annotation.jdk.db.provider.Column;
import io.mykit.annotation.jdk.db.provider.Table;

/**
 * 解析自定义注解
 * @author liuyazhuang
 *
 */
public class AnnotationParser {
	/** 
     * 通过注解来组装查询条件,生成查询语句 
     * @param obj 
     * @return 
     */  
    public static String assembleSqlFromObj(Object obj) {  
        Table table = obj.getClass().getAnnotation(Table.class);  
        StringBuffer sbSql = new StringBuffer();  
        String tableName = table.value();  
        sbSql.append("select * from " + tableName + " where 1=1 ");  
        Field[] fileds = obj.getClass().getDeclaredFields();  
        for (Field f : fileds) {  
            String fieldName = f.getName();  
            String methodName = "get" + fieldName.substring(0, 1).toUpperCase()  
                    + fieldName.substring(1);  
            try {  
                Column column = f.getAnnotation(Column.class);  
                if (column != null) {  
                    Method method = obj.getClass().getMethod(methodName);  
                    Object v = method.invoke(obj);  
                    if (v != null) {  
                        if (v instanceof String) {  
                        	String value = v.toString().trim();
                            // 判断参数是不是 in 类型参数 1,2,3  
                            if (value.contains(",")) {  
                            	//去掉value中的,
                            	String sqlParams = value.replace(",", "").trim();
                            	//value中都是纯数字
                            	if(isNum(sqlParams)){
                            		sbSql.append(" and " + column.value() + " in (" + value + ") ");  
                            	}else{
                            		String[] split = value.split(",");
                            		//将value重置为空
                            		value = "";
                            		for(int i = 0; i < split.length - 1; i++){
                            			value += "'"+split[i]+"',";
                            		}
                            		value += "'"+split[split.length - 1]+"'";
                            		sbSql.append(" and " + column.value() + " in (" + value + ") ");  
                            	}
                            } else {  
                            	if(value != null && value.length() > 0){
                            		sbSql.append(" and " + column.value() + " like '%" + value + "%' ");  
                            	}
                            }  
                        } else {
                            sbSql.append(" and " + column.value() + "=" + v.toString() + " ");  
                        }  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        return sbSql.toString();  
    }  
  
    /** 
     * 检查给定的值是不是 id 类型 1.检查字段名称 2.检查字段值 
     *  
     * @param target 
     * @return 
     */  
    public static boolean isNum(String target) {  
        boolean isNum = false;  
        if (target.toLowerCase().contains("id")) {  
            isNum = true;  
        }  
        if (target.matches("\\d+")) {  
            isNum = true;  
        }  
        return isNum;  
    }  
}

5、测试类

package io.mykit.annotation.jdk.provider;

import org.junit.Test;

import io.mykit.annotation.jdk.db.provider.entity.User;
import io.mykit.annotation.jdk.db.provider.parser.AnnotationParser;
import io.mykit.annotation.jdk.provider.parser.AnnotationProcessor;

/**
 * 测试自定义注解
 * @author liuyazhuang
 *
 */
public class AnnotationTest {
	
	@Test
	public void testDBAnnotation(){
		User testDto = new User("123", "34");  
		User testDto1 = new User("123", "test1");  
		User testDto2 = new User("", "test1,test2,test3,test4");  
        String sql = AnnotationParser.assembleSqlFromObj(testDto);  
        String sql1 = AnnotationParser.assembleSqlFromObj(testDto1);  
        String sql2 = AnnotationParser.assembleSqlFromObj(testDto2);  
        System.out.println(sql);  
        System.out.println(sql1);  
        System.out.println(sql2);  
	}
}

6、测试结果

select * from t_user where 1=1  and id like '%123%'  and name like '%34%' 
select * from t_user where 1=1  and id like '%123%'  and name like '%test1%' 
select * from t_user where 1=1  and name in ('test1','test2','test3','test4') 
select * from t_user where 1=1  and id like '%123%'  and name like '%34%' 
select * from t_user where 1=1  and id like '%123%'  and name like '%test1%' 
select * from t_user where 1=1  and id like '%456%'  and name in (1,2,3,4) 

你可能感兴趣的:(JAVA,Java)