标签:java
最近学习了一下Java的自定义注解,终于知道了框架那些注解是咋个写出来的了,以后我也可以自己写框架,自己定义注解,听着是不是很牛的样子?不要心动,赶快行动,代码很简单,一起来学习一下吧!
这个例子是模仿框架的一个对sql拼装的例子,用注解实现对model也就是实体类的注释,就可以写出查询该字段的sql.好了,废话少说,一看代码便知。大家可以根据自己的需求修改。
package com.annotation.demo; 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; /** * 1. @interface 定义注解关键字 * 2. 元注解: * @Target:注解的作用域 * ElementType * TYPE:类接口声明 * CONSTURCTOR:构造方法声明 * FILED:字段声明 * LOCAL_VARIABLE:局部变量声明 * METHOD:方法声明 * PARCKAGE:包声明 * PARMETER:参数声明 * @Retention:注解的声明周期 * RetentionPolicy * RUNTIME:运行时存在,可以通过反射读取 * SOURCE:只在源码显示,编译时会丢弃 * CLASS:编译时会记录到class中,运行时忽略 * @Inherited:允许子类继承 * @Documented:生成javadoc时会包含注解 * 3. 使用自定义注解 * @<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>,...) * 如: * @MyAnnotation(name="Stephen.Huang", date="2015-7-30") * public void MyMethod() { * //TODO * } * * * @author Stephen Huang * @see http://blog.csdn.net/u010571844 * */ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Table { /** * 1.成员以无参无异常声明 * 2.可以用default为成员指定一个默认值,如:int age() default 18; * 3.成员类型是受限制的,合法的类型包括原始类型及String,Class,Annotation, Enumeration。 * 4.如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和‘=’。 * 5.注解类可以没有成员,没有成员的注解称为标注注解。 * @return */ String value(); }2.再定义数据table中字段的注解Clounm
package com.annotation.demo; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * * @author Stephen Huang * */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String value(); }
package com.annotation.demo; @Table("user") public class User { @Column("id") private Integer id; @Column("user_name") private String userName; @Column("email") private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
package com.annotation.demo; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * * @author Stephen Huang * */ public class test { /** * @param args */ public static void main(String[] args) { User user1 = new User(); user1.setId(1);//search user id 1 User user2 = new User(); user2.setUserName("Stephen");//search user name 'stephen' User user3 = new User(); user3.setEmail("stephenhuang@qq.com, stephenhuang@163.com");//search user email '' String sql1 = query(user1); String sql2 = query(user2); String sql3 = query(user3); System.out.println(sql1); System.out.println(sql2); System.out.println(sql3); } private static String query(Object f) { StringBuffer sb = new StringBuffer(); //1.get class Class c = f.getClass(); //2.get table name boolean exits = c.isAnnotationPresent(Table.class); if (!exits) { return null; } Table t = (Table) c.getAnnotation(Table.class); String tableName = t.value(); sb.append("select * from ").append(tableName).append(" where 1=1"); Field[] fArray = c.getDeclaredFields(); for (Field field : fArray) { boolean fexits = field.isAnnotationPresent(Column.class); if (!fexits) { continue; } Column clolumn = field.getAnnotation(Column.class); String clolumnName = clolumn.value(); String filedName = field.getName(); String getMethodName = "get" + filedName.substring(0, 1).toUpperCase() + filedName.substring(1, filedName.length()); Object filedValue = null; try { Method getMethod = c.getMethod(getMethodName); filedValue = getMethod.invoke(f); } catch (Exception e) { e.printStackTrace(); } if (filedValue == null || (filedValue instanceof Integer && (Integer)filedValue == 0)){ continue; } sb.append(" and ").append(filedName); if (filedValue instanceof String) { if (((String) filedValue).contains(",")) { String[] filedValues = ((String) filedValue).split(","); sb.append(" in ("); for (String value : filedValues) { sb.append("'").append(value).append("',"); } sb.deleteCharAt(sb.length() - 1); sb.append(")"); } else { sb.append(" = '").append(filedValue).append("'"); } } else { sb.append(" = ").append(filedValue); } } return sb.toString(); } }
select * from user where 1=1 and id = 1 select * from user where 1=1 and userName = 'Stephen' select * from user where 1=1 and email in ('stephenhuang@qq.com',' stephenhuang@163.com')
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:java
原文地址:http://blog.csdn.net/u010571844/article/details/47157173