java对象属性的默认值影响sql查询语句的拼接,该如何处理。

1、问题描述:
想做一个通用的sql查询语句,通过传入对象的属性赋值情况,拼接查询语句。比如Admin类,有int id,String name,int age,boolean isLeader 4个属性,如果给Admin的对象的某几个属性赋值,比如:setAge(32);setName(“张”)。那么语句拼接为select * from admin where age=32 and name like '%张%'。我在拼接时本来想通过属性是否为null,或者是否为空字符来判断是否作为查询条件,但是由于默认值的存在,导致拼接错误。
2、代码

/***
 * 约定:
 * 1、类名与表名对应,表名全小写。
 * 2、类属性与列名一致。
 * 3、ID列的类属性和列名为=表名(第一个字母小写)+“Id” * 
 * 4、暂不支持联表查询。
 *类名:BaseDao
 * ***/
public <T> List<T> query(T t) throws IllegalArgumentException, IllegalAccessException, SQLException{
        StringBuilder sql=new StringBuilder();
        StringBuilder whereString=new StringBuilder();
        List<Object> parameters=new ArrayList<Object>();
        Class clazz=t.getClass();
        //获取类名
        String classSimpleName=clazz.getSimpleName();
        //获取表名
        String tableName=classSimpleName.toLowerCase();
        //拼接select语句前半部分
        sql.append("select * from "+tableName);
        //获取所有类属性
        Field[] fields=clazz.getDeclaredFields();
        //遍历所有属性
        for(Field field:fields) {           
            field.setAccessible(true);
            //得到属性值
            Object fieldValue=field.get(t);

            if(fieldValue!=null) {              
            //如果属性值不为null,获取属性名(字段名)。
                String fieldName=field.getName();
                //判断是否为String类型
                if(fieldValue instanceof String) {
            //  如果是String,判断是否为空字符
                    if(!("".equals(((String)fieldValue).trim()))) {
                    //不是空字符串,作为where条件,并将参数加入列表。
                        whereString.append(fieldName+" like ? and ");
                        parameters.add("%"+(String)fieldValue+"%");
                    }                       
                }else if("Integer".equals(fieldValue.getClass().getSimpleName())){
                /***判断是否为int,如果int>0,认为参数有效---这个也是为了处理默认值为0的情况,想的办法,但是有时候表里面字段值可能<=0,所以我觉得处理得不**好*/
                    if((int)fieldValue>0) {
                        whereString.append(fieldName+"=? and ");
                        parameters.add(fieldValue);
                    }
                }else{
                /*其他情况直接作为where查询条件,但是运行发现boolean值默认false,也会直接当成是有效条件,影响条件设置*/
                    whereString.append(fieldName+"=? and ");
                    parameters.add(fieldValue);
                }
            }
        }
        //判断是否有有效条件,有的话拼接where语句。
        if(parameters.size()>0) {
            whereString.delete(whereString.length()-5, whereString.length()-1);
            sql.append(" where ");
            sql.append(whereString);
        }   
        System.out.println(sql.toString());
        System.out.println(parameters);
        //连接数据库,查询。
        QueryRunner qr=JdbcPool.getQueryRunner();
//      return null;
        return qr.query(sql.toString(), new BeanListHandler<T>(clazz), parameters.toArray());
    }

3、测试代码

    @Test
    public void BaseDao() throws Exception, IllegalAccessException {
        IpAddress ipObj=new IpAddress();
        //只设置了一个条件。
        ipObj.setIpAddress("192.168.1");
        BaseDao bd=new BaseDao();
        List<IpAddress> list=bd.query(ipObj);
        for(IpAddress ip:list) {
            System.out.println(ip);
        }
        System.out.println(list.size());        
    }

4、结果

//在只设置了一个条件的情况下,拼接出两个查询条件。
select * from ipaddress where ipAddress like ? and isReachable=? 
[%192.168.1%, false]

5、问题:
请问如何处理这种由于对象基本类型默认值,导致的拼接错误的问题?

2个回答

可以把Admin类中的基本类型改为包装类型,包装类型的默认值为null

int改为Integer boolean改为Boolean 默认值为null

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问