moummm
2017-09-25 20:52
public class Test { public static void main(String[] args) throws Exception { Filter f1 = new Filter(); f1.setId(3);//查询id为3的客户 Filter f2 = new Filter(); f2.setEmail("123@qq.com, 888@163.com, 456@126.com");//查询邮箱任一的客户 Filter f3 = new Filter(); f3.setMobile("18798765432");//查询电话为 Test t = new Test(); String sql1 = t.query(f1); String sql2 = t.query(f2); String sql3 = t.query(f3); System.out.println(sql1); System.out.println(sql2); System.out.println(sql3); } public String query(Filter filter) throws Exception { //1、拿到类的实例 Class c = filter.getClass(); boolean b = c.isAnnotationPresent(Table.class); if (!b){ return null; } StringBuilder sb = new StringBuilder(); //2、获取注解的实例 Table t = (Table)c.getAnnotation(Table.class); sb.append(" select * from ").append(t.value()).append(" where 1=1 "); //3、遍历所有的字段 Field[] fArrays = c.getFields(); //4、开始处理每个字段 for (int i=0;i<fArrays.length;i++){ //4.1 获取到字段名 boolean fExist = fArrays[i].isAnnotationPresent(Column.class); if (!fExist) continue; String fieldName = fArrays[i].getName(); Column column = fArrays[i].getAnnotation(Column.class); String cName = column.value(); //4.2 拿到字段的值 String getMethodName = "get"+cName.substring(0,1).toUpperCase()+cName.substring(1); Method getMethod = c.getMethod(getMethodName); Object fieldValue = getMethod.invoke(getMethodName); //4.3 拼装sql if(fieldValue==null||(fieldValue instanceof Integer && (Integer)fieldValue==0)) continue; sb.append(" and ").append(fieldName); if (fieldValue instanceof String) { if(((String) fieldValue).contains(",")){ String[] fv = ((String) fieldValue).split(","); sb.append(" in( "); for (String f : fv){ sb.append("'").append(f).append("',"); } sb.deleteCharAt(fv.length-1); sb.append(")"); }else sb.append(" = ").append("'").append(fieldValue).append("'"); } else sb.append(" = ").append(fieldValue); } return sb.toString(); } }
@Table("filter") public class Filter { @Column("id") private int id; @Column("u_uname") private String userName; @Column("u_nname") private String nickName; @Column("u_age") private int age; @Column("u_city") private String city; @Column("u_email") private String email; @Column("u_mobile") private String mobile; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } 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; } }
你的47行 得到 column.value(); 之后, 你看看你的filter类中, 字段注解全部是 u_****什么的,你用这个字符串。首字母大写,然后去调用get方法,你肯定什么都得不到啊。
第36行 的 方法错了c.getFields() 应该是 getDeclaredFields();
全面解析Java注解
127205 学习 · 111 问题
相似问题