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条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能