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、问题:
请问如何处理这种由于对象基本类型默认值,导致的拼接错误的问题?