java注解

java注解的好处
注解的好处在于可以使代码简洁化。特别是在框架中。注解的使用可以代替XML的使用。实现代码的简洁化。
java注解分类
按来源分:java自带注解、第三方注解、自定义注解
按生命周期分:源码注解、编译时注解、运行时注解
自定义注解的结构:元注解(用来注解注解的)
接口定义、无参无异常的成员方法的定义(成员类型受限:基本数据类型、String、枚举)
JDK自带注解
@Override,表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法, 编译器就会发出错误提示。
@Deprecated,修饰过时的方法。如果程序员不小心使用了它的元素,那么编译器会发出警告信息。
@Suppvisewarnings,关闭不当的编译器警告信息
@Override 表示这个方法是重写的
@Deprected 表示指示的程序元素是不赞成程序员使用的,如果程序元素被使用,则会有警告。
@Suppvisewarnigs 表示忽略程序元素的警告 比如@Suppvisewarnings(“deprected”) 或者
@Suppvisewarnings(value={"",""}) @Suppvisewarnings({})

自定义注解
成员类型是受限的,合法的类型包括原始类型及String,Calss,Anootation,Enumreation
如果注解已有一个成员,则成员名必须取名为Vaue(),在使用的时可以忽略成员名和赋值号(=)
注解类可以没有成员,没有成员的注解成为表示注解

元注解
@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD})
// Target 注解的作用域 CONSTRUCTOR 构造方法声明,FIELD 字段声明,LOCAL_VARIABLE 局部变量声明 ,METHOD 方法声明,PACKAGE 包声明,PARAMETER 参数声明,TYPE 类接口。
@Retention(RetentionPolicy.RUNTIME)
//Retention 生命周期 SOURCE 只在源码显示,编译时会丢弃,CLASS 编译时会记录到class中,运行时忽略,RUNTIME 运行时存在,可以通过反射读取。
@Inherited
//Inherited 允许子类继承
@Documented 生成javadoc的时候包含注解
@Target 注解的作用域。
@Retention 生命周期。
@Inherited 允许子类继承
@Documented 生成javadoc时会包含注解

   @Target({ElementType.METHOD,}) //作用域
        @Retention(RetentionPolicy.RUNTIME) //生命周期
        @Inherited //标识注解(允许子类继承)
        @Documented //生成javadoc会生成注解信息
        public @interface Description {
            //1.类型受限制,包括基本类型及String、Class、Annotation、Enumeration
            //2.若只有一个成员,则名称必须为value(),使用时可以忽略成员名和赋值号(=)
            //3.注解类可以没有成员,称为标识注解
            //4成员无参且无异常声明
        String desc();
        String author();
        //5可指定默认值
        int age() default 18;
        }     

具体代码实现:通过注解,实现sql语句的拼接。可用于Hibernate,以及框架。
1.创建数据库表结构
//表一

        @Table("user")
public class Filter {
	
	@Column("u_id")
	private int u_id;
 
	@Column("u_password")
	private String u_password;
	
	@Column("u_email")
	private String u_email;

//生成get,set方法
}

//表二

@Table("admin")
public class Filter1 {
	
	@Column("adminId")
	private int adminId;
	
	@Column("adminName")
	private String adminName;
	
	@Column("adminPassword")
	private String adminPassword;
    //生成get,set方法
} 

2。创建注解类(注解表)
//注解域,类

 @Target(ElementType.TYPE)
//生命周期。在运行时刻
 @Retention(RetentionPolicy.RUNTIME)
public @interface Table {	
	String value();
}
    //注解表的列,也就是成员变量
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
		
		String value();
}

3.测试类

   public class Test {
            public static void main(String[] srgs){
                    Filter f1 = new Filter();
		    Filter f2 = new Filter();
                    Filter1 filter2 = new Filter1();//测试多张表的情况
                    f1.setU_id(10);//查询id为10的用户
	            f2.setU_name("whoami");//查询姓名为whoami
                    filter2.setAdminPassword("123456");
                    String sql1 = query(f1);
	            String sql2 = query(f2);
                    String filter2Sql= query(filter2);
		    System.out.println(filter2Sql);
                    System.out.println(sql1);
		    System.out.println(sql2); 
    } 
            //用于拼接sql语句的方法,Object.---->表类(针对不同的表类)
             private static String query(Object  f){
                      /**
			 * 	String 字符串常量
			 *	StringBuffer 字符串变量(线程安全)
			 *	StringBuilder 字符串变量(非线程安全)
			 */
                        //用于拼接字符串
                        StringBuilder sb = new StringBulder(); 
                         //得到类
                        Class   c =  f.getClass();
                         //得到表名,判断是否存在注解
                            boolean b = c.isAnnotationPreaent(Table.class);
                            if(!b){  return null; } 
                            Table  t  =  c.getAnnotation(Table.class);
                            String tableName =  t.value();
                            System.out.println("tableName---> "+tableName)
                            //为什么加上1=1.是为了后面没有查询条件时不会报错
                            sb. append("SELECT FROM  ").append(tableName).append( " WHERE 1=1 " );
                            //查询到了表名,当有条件查询时。我们要获得字段名,就是表里面的属性,
                            //下一步。遍历字段字段信息,相当于成员变量
                            Field [] fArray = c.getDeclearedFields();
                            for(Field field : fArry){
                                           boolean b1 = field.getAnnotationPreaent(Column.class);
                                            if(!b1){ continue; }
                                        `    //获得字段名从而得到方法名
                                                Column c = field.getAnnotation(Column.class);
                                                   Stirng fName = c.value();
                                                  System.out.,print("字段名:“+fName);
                                `                //String fieldName = field.getName();得到成员变量
                                                    String getMethodName = "get"+fName.substring(0,1).toUpperCase()+fName.substring(1);
                                                    System.out.println(getMethodName);
                                                    Object  fieldValue = null;
                                                    try{
                                                            Method getMethod = c.getMethod(getMethodName);
                                                            fieldValue = getMethod.invoke(f); 
                                                        }catch(Exception e){
                                                            e.printStackTrace();
                                                        }
                                               //拼装sql
				                if(fieldValue==null || (fieldValue instanceof Integer && (Integer)fieldValue==0 )){
					                continue;
			                	}
				sb.append(" and ").append(filedName);
				if(fieldValue instanceof String){
					if(((String) fieldValue).contains(",")){
					String[] value = ((String) fieldValue).split(",");
					sb.append("in (");
					for (String string : value) {
						sb.append("' ").append(string).append(" ',");		
					}
					sb.deleteCharAt(sb.length()-1);
					sb.append(")");
					}else{
					sb.append(" = ").append("'").append(fieldValue).append("'");
					}
				}else{
				sb.append(" = ").append(fieldValue);
				}
			}
			return sb.toString();

                   }
        }
}         


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值