注解介绍: java SE5内置了三种,定义在java.lang中的注解: @Override,表示当前的方法定义将覆盖超类中的方法。 @Deprecated,如果程序员使用了注解为它的元素,那么编译器会发出警告信息。 @SuppressWarnings,关闭不当的编译器警告信息。 元注解 @Target 用来定义你的注解应用于什么地方,例如是一个方法或者一个域。 CONSTRUCTOR :构造器的声明 FIELD : 域声明 METHOD :方法声明 PACKAGE : 包生明 TYPE : 类、接口或enmu声明 @Retention 用来定义该注解在哪一个级别可用,在源代码中(SOURCE),类文件中(CLASS)或者运行时(RUNTIME) @Documented 将此注解包含在javadoc中 @Inherited 允许子类继承父类中的注解 注解元素可用的类型,所有的基本类型:int,float,boolean等、String、Class、enum、Annotation 定义一个注解Test: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Test(){ String value(); }
// 下面使用注解来生成sql语句 1、先定义2个注解类,Table,Column 2、定义一个JavaBean类 3、编写注解实现类 注解类:Table @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Table { String value(); } 注解类:Column @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String value(); } javaBean类 @Table(value = "USER") public class UserBean { @Column(value = "id") private int id; @Column(value = "userId") private String userId; @Column(value = "userName") private String userName; @Column(value = "email") private String email; @Column(value = "mobile") private String mobile; @Column(value = "phone") private String phone; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } 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; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } } 4、注解测试类 public class MainTest { public static void main(String[] args) { UserBean userBean = new UserBean(); userBean.setId(10); userBean.setEmail("[email protected]"); beanSql(userBean); } public static String beanSql(Object user){ StringBuffer sql = new StringBuffer(); Class c = user.getClass(); boolean flag = c.isAnnotationPresent(Table.class); // 判断该类是否包含Table的注解,返回true/false if(!flag){ return null; } Table table = (Table) c.getAnnotation(Table.class); // 获取到注解对象 String tableName = table.value(); // 获取到注解对象的值 sql.append("select * from ").append(tableName).append(" where 1=1"); // 获取该类中字段的注解 //Field[] fields = c.getFields(); Field[] fields = c.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { boolean fieldFalg = fields[i].isAnnotationPresent(Column.class); if(!fieldFalg){ continue; } Column column = fields[i].getAnnotation(Column.class); String fieldName = column.value(); // 字段的名称 Object fieldValue = null ; // 字段的值 // 字段的值获取,使用反射 try { // 获取方法名如:getId() String methodName = "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1).toString(); // 通过反射invoke获取到值 Method method = c.getMethod(methodName); fieldValue = method.invoke(user,null); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } if(fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0)){ continue; } if(fieldValue instanceof String){ sql.append(" and ").append(fields[i].getName()).append("=‘").append(fieldValue).append("‘"); }else if(fieldValue instanceof Integer){ sql.append(" and ").append(fields[i].getName()).append("=").append(fieldValue); } } System.out.println(sql.toString()); return sql.toString(); } } 生成sql如下:select * from USER where 1=1 and id=10 and email=‘[email protected]‘;
方法说明: getAnnotation(Table.class):检查对象是否带有@Table注解 getFields() : 获得某个类的所有的公共(public)的字段,包括父类。 getDeclaredFields() :获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段isAnnotationPresent(Table.class): 指定注释类型的注释存在于此元素上
原文地址:https://www.cnblogs.com/zhangcece/p/8997769.html
时间: 2024-10-15 05:05:43