sanshui_yangfei 2020-01-14 00:08 采纳率: 20%
浏览 413
已采纳

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条回答 默认 最新

  • Hefei19881002 2020-01-14 09:11
    关注
    可以把Admin类中的基本类型改为包装类型,包装类型的默认值为null
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog