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;
????}
}
2017-09-27
你的47行? 得到 column.value(); 之后, 你看看你的filter類中, 字段注解全部是 u_****什么的,你用這個字符串。首字母大寫,然后去調用get方法,你肯定什么都得不到啊。
2017-09-26
第36行 的 方法錯了c.getFields()? 應該是? getDeclaredFields();