最近做项目中有接触到反射的使用简单的做了一个注释 首先的想法是根据类中不为空的值生成sql 首先是三个注解 主键注解 package comments; 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; /** * 主键 * @author Administrator */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface Key { } package comments; 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; /** * 如果不和数据关联则设置此注解 * @author Administrator * */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface notRecord { } package comments; 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; /** * 设置表名 * @author Administrator * */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface Table { public String name(); } 然后是自定义异常类 package org; /** * 设置自定义异常 * @author Administrator * */ public class NumException extends Exception { private String name; public NumException(String name){ this.name=name; } public String toString(){ return name; } } 实体类 package org; import comments.Key; import comments.Table; import comments.notRecord; @Table(name = "student") public class Student { @Key private String id; private String name; @notRecord private String sex; private int age; 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; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 处理实体类生成sql的类。 package org; import java.lang.reflect.Field; import comments.Key; import comments.Table; import comments.notRecord; public class Processing { /** * 通过实体类生成 insert into sql语句 * @param cl * @return * @throws IllegalArgumentException * @throws IllegalAccessException * @throws NumException */ public String save(Object cl) throws IllegalArgumentException, IllegalAccessException, NumException{ String sql="insert into "; if(cl!=null){ Field[] fiels=cl.getClass().getDeclaredFields();//获得反射对象集合 boolean t=cl.getClass().isAnnotationPresent(Table.class);//获得类是否有注解 if(t){ Table tab=cl.getClass().getAnnotation(Table.class); sql+=tab.name();//获得表名 String name ="";//记录字段名 String value ="";//记录值名称 boolean bl=false;//记录主键是否为空 for(Field fl:fiels){//循环组装 fl.setAccessible(true);//开启支私有变量的访问权限 Object tobj=fl.get(cl); if(tobj!=null){ if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键 bl=true; } if(!fl.isAnnotationPresent(notRecord.class)){ name+=fl.getName()+","; value+="'"+tobj.toString()+"',"; } } } if(bl){ if(name.length()>0) name=name.substring(0,name.length()-1); if(value.length()>0) value=value.substring(0,value.length()-1); sql+="("+name+") values("+value+")"; }else throw new NumException("未找到类主键 主键不能为空"); }else throw new NumException("传入对象不是实体类"); }else throw new NumException("传入对象不能为空");//抛出异常 return sql; } /** * 传入对象更新 * @param obj * @return * @throws IllegalArgumentException * @throws IllegalAccessException * @throws NumException */ public String update(Object obj) throws IllegalArgumentException, IllegalAccessException, NumException{ String sql="update "; if(obj!=null){ Field[] fiels=obj.getClass().getDeclaredFields();//获得反射对象集合 boolean t=obj.getClass().isAnnotationPresent(Table.class);//获得类是否有注解 if(t){ Table tab=obj.getClass().getAnnotation(Table.class); sql+=tab.name()+" set ";//获得表名 String wh ="";//记录字段名 String k=""; boolean bl=false;//记录主键是否为空 for(Field fl:fiels){//循环组装 fl.setAccessible(true);//开启支私有变量的访问权限 Object tobj=fl.get(obj); if(tobj!=null){ if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键 bl=true; k=fl.getName()+"='"+tobj.toString()+"' where "; }else{ if(!fl.isAnnotationPresent(notRecord.class)){ wh+=fl.getName()+"='"+tobj.toString()+"',"; } } } } if(bl){ if(wh.length()>0) wh=wh.substring(0,wh.length()-1); if(k.length()>0) k=k.substring(0,k.length()-1); sql+=k+wh; }else throw new NumException("未找到类主键 主键不能为空"); }else throw new NumException("传入对象不是实体类"); }else throw new NumException("传入对象不能为空");//抛出异常 return sql; } } 最后是测试类 package org; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import comments.Table; import comments.Key; public class temp { public static void main(String[] aa) throws IllegalArgumentException, IllegalAccessException, NumException{ Student stu=new Student(); stu.setId("ccc"); stu.setName("姓名"); stu.setAge(18); stu.setSex("男"); //stu=null; System.out.println(new Processing().save(stu)); System.out.println(new Processing().update(stu)); } }
java注解和反射示例
猜你喜欢
转载自421728862.iteye.com/blog/2331680
今日推荐
周排行