利用注解动态生成sql

本文探讨如何在Java应用程序中使用注解来动态生成SQL查询,提高代码的可读性和灵活性,降低硬编码SQL带来的维护成本。通过注解配置,实现从简单的CRUD操作到复杂的业务查询的自动化构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)

public @interface DBTable {

	public String name() default "mytable";
}
@SuppressWarnings("all")
@DBTable(name="mytable")
public class Person implements Serializable {
	@SQLInteger(constraints=@Constraints(primaryKey=true,unique=true))
	private int id;
	@SQLString(value=12)private String name;
	@SQLInteger(value = 5) private int age;

}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SQLInteger {

String name() default  "";
int value() default 0;
Constraints constraints() default @Constraints;



}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@SuppressWarnings("all")
public @interface SQLString {
	String name() default "";
	int value() default 0;
	Constraints constraints() default @Constraints;
}
@DBTable
@SuppressWarnings("all")
public class Student implements Serializable{
@SQLString(value=12) String name;
@SQLInteger (value = 5) int age;
}



@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints {
boolean primaryKey() default false;
boolean unique() default false;
boolean NULL() default false;
}
@SuppressWarnings("all")
public class AnnotationParse {


	public static void main(String[] args) throws ClassNotFoundException {
		String colunm = null;
		Scanner sc = new Scanner(System.in);
		String className = sc.nextLine();
		Class<?> cls = Class.forName(className);
		DBTable dbtable = cls.getAnnotation(DBTable.class);
		if(dbtable!=null){
			if(dbtable.name().length()<1){
				colunm = cls.getName();
			}else{
				colunm = dbtable.name();
			}
		}
//-----------------------------------------------------------------------------------------
		ArrayList<String> list = new ArrayList<>();
	    for(Field f:cls.getDeclaredFields()){
	    	System.out.println(f.getName());
	    	 Annotation[] anns =   f.getAnnotations();
	    	 if(anns[0] instanceof SQLString){
	    		SQLString sqlString = (SQLString)anns[0];
	    		if(sqlString.name().length()<1){
	    			list.add(f.getName()+"   VARCHAR("+sqlString.value()+")");
	    		}else{
	    			list.add(sqlString.name()+"    VARCHAR(+"+sqlString.value()+")"+getConstraints(sqlString.constraints()));
	    		}
	    	 }else if(anns[0] instanceof SQLInteger){
	    		 SQLInteger sqlInteger = (SQLInteger) anns[0];
	    		 if(sqlInteger.name().length()<1){
	    			 list.add(f.getName()+"   int("+sqlInteger.value()+")");
	    		 }else{
	    			 list.add(sqlInteger.name()+"    int("+sqlInteger.value()+")"+getConstraints(sqlInteger.constraints()));
	    		 }
	    	 }
	    	 
	    }
	    
	    
//------------------------------------------------------------------------------------------	    
	StringBuffer sqlCommand = new StringBuffer();   
	sqlCommand.append("Create   "+colunm +"{"+"\n");
	
	for(int i = 0;i<list.size()-1;i++){
		sqlCommand.append(list.get(i)+","+"\n");
	}
	sqlCommand.append(list.get(list.size()-1)+"\n"+"}");
		
		System.out.println(sqlCommand);
	}


	private static String getConstraints(Constraints constraints) {
		String str = null;
		if(!constraints.NULL()){
			str+="NULL";
		}else if(!constraints.unique()){
			str+="unqiue";
		}else if(!constraints.primaryKey()){
			str+="primarykey";
		}
		return str;
	}


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值