A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

可能是受到设计模式的思想影响,在碰到臃肿繁琐的代码的时候总是会很头疼想改掉,这次做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) {
                    }
                }

这样参数的变更只需要修改对应的实体类即可,而用到反射的多个地方都是不需要进行任何代码的修改的。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马