为什么我这 1=1 后面获取不了sql语句了呢?

来源:5-2 项目实现(上)

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;
    }
}


写回答 关注

2回答

  • qq_北乐_0
    2017-09-27 14:09:37

    你的47行  得到 column.value(); 之后, 你看看你的filter类中, 字段注解全部是 u_****什么的,你用这个字符串。首字母大写,然后去调用get方法,你肯定什么都得不到啊。

  • qq_北乐_0
    2017-09-26 17:01:09

    第36行 的 方法错了c.getFields()  应该是  getDeclaredFields();

    moummm

    Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 修改后报出了参数异常,这是怎么回事?

    2017-09-27 01:06:49

    共 1 条回复 >

全面解析Java注解

注解Java中的常用技能,通过实战演示注解在实际项目中的应用

127205 学习 · 111 问题

查看课程

相似问题