可能是受到设计模式的思想影响,在碰到臃肿繁琐的代码的时候总是会很头疼想改掉,这次做java的客户端程序用的jdbc操作数据库,在根据条件查询的情况一开始是通过
pst.setString(1,"xxx");
pst.setString(2,"xxx");
来赋值条件,并在
pst = conn.prepareStatement(sql);
中人工的判断有多少个条件就输入多少个问号。
但是这种方式在条件多变的情况下并不适合,会导致大量的代码修改。
于是乎,很自然的就想到了通过反射来修改一下原有的代码。
方法中只需要传入我的对象myEmailBean,通过一个方法来取得值不为空key、value对应(也是通过反射)。
HashMap<String, String> hashMap = MyUtil.getValue(myEmailBean);
这样就可以动态拼凑出一个动态查询的sql条件
StringBuilder sb = new StringBuilder("select t.* from weight_log t ");
Set<String> keySet = hashMap.keySet();
for (String key : keySet) {
sb.append("where t." + key.toLowerCase() + " like \"%\"?\"%\" ");
}
pst = conn.prepareStatement(sb.toString());
int i = 1;
for (String key : keySet) {
pst.setString(i++, hashMap.get(key));
}
ResultSet resultSet = pst.executeQuery();
再拿一个容易看懂的例子
原先的取结果方式:
result.setWaybill_no(resultSet.getString("waybill_no") == null ? "" : resultSet.getString("waybill_no"));
result.setPost_code(resultSet.getString("post_code") == null ? "" : resultSet.getString("post_code"));
result.setWeight(resultSet.getString("weight") == null ? "" : resultSet.getString("weight"));
result.setReceiver_linker(resultSet.getString("receiver_linker") == null ? "" : resultSet.getString("receiver_linker"));
result.setReceiver_addr(resultSet.getString("receiver_addr") == null ? "" : resultSet.getString("receiver_addr"));
result.setReceiver_box(resultSet.getString("receiver_box") == null ? "" : resultSet.getString("receiver_box"));
result.setPostage_paid(resultSet.getString("postage_paid") == null ? "" : resultSet.getString("postage_paid"));
result.setReceiver_desc(resultSet.getString("receiver_desc") == null ? "" : resultSet.getString("receiver_desc"));
每当参数有变化或者增减参数这一块的获取结果就需要进行改变
在用了反射之后
MyEmailBean result = new MyEmailBean();
Field[] fields = result.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
field.set(result, resultSet.getString(field.getName()));
} catch (Exception e) {
}
}
这样参数的变更只需要修改对应的实体类即可,而用到反射的多个地方都是不需要进行任何代码的修改的。
|
|