开发者社区> 问答> 正文

关于java查询语句 如何简化的问题

public static void main(String[] args) {
        List<Map<String, Object>> params = new ArrayList<Map<String,Object>>();
        Map<String, Object> param = new HashMap<String, Object>();
        
        //查询条件
        param.put("k", "user_name");
        param.put("v", "'小美'");
        param.put("rela", "=");
        params.add(param);

        //查询条件
        param = new HashMap<String, Object>();
        param.put("k", "mobile");
        param.put("v", "18712345678");
        param.put("rela", "=");
        params.add(param);
        
        //查询条件 
        param = new HashMap<String, Object>();
        param.put("k", "age");
        param.put("v", 33);
        param.put("rela", "=");
        params.add(param);
        
        //如果我查询条件很多,这里要写一堆param吗?怎么写可以简洁一点??
        query(params);
    }

    public List<Goddess> query(List<Map<String, Object>> params) throws Exception{
        List<Goddess> result=new ArrayList<Goddess>();
        Connection conn=DBUtil.getConnection();
        StringBuilder sb=new StringBuilder();
        sb.append("select * from imooc_goddess where 1=1 ");
        
        if(params!=null&&params.size()>0){
            for (int i = 0; i < params.size(); i++) {
                Map<String, Object> map=params.get(i);
                sb.append(" and  "+map.get("name")+" "+map.get("rela")+" "+map.get("value")+" ");
            }
        }
        
        PreparedStatement ptmt=conn.prepareStatement(sb.toString());
        
        System.out.println(sb.toString());
        ResultSet rs=ptmt.executeQuery();
        
        Goddess g=null;
        while(rs.next()){
            g=new Goddess();
            g.setId(rs.getInt("id"));
            g.setUser_name(rs.getString("user_name"));
            g.setAge(rs.getInt("age"));
            g.setSex(rs.getInt("sex"));
            g.setEmail(rs.getString("email"));
            g.setMobile(rs.getString("mobile"));
            result.add(g);
        }
        return result;
    }

展开
收起
a123456678 2016-07-04 17:32:15 2020 0
1 条回答
写回答
取消 提交回答
  • 首先,请你告诉我你使用PreparedStatement的理由,为什么不使用Statement?二者有什么区别?
    然后 你用到了PreparedStatement的特性了吗?

    接下来我们在探讨这代码该怎么写。下面的代码仅供参考,基本不具有实践意义。

    public static void main(String[] args) {
            Map<String, Object> params = new HashMap<String, Object>();
            
            param.put("user_name", "小美");
            param.put("mobile", "18712345678");
            param.put("age", "33");
            
            // 如果传递条件不限于相等,则如下
            // param.put("nick_name like=?", "小李");
            // param.put("age=?", "33");
            
            query(params);
        }
    public List<Goddess> query(Map<String, Object> params) throws Exception{
        List<Goddess> result=new ArrayList<Goddess>();
        Connection conn=DBUtil.getConnection();
        StringBuilder sb=new StringBuilder();
        sb.append("select * from imooc_goddess");
        
        if(params!=null && params.keySet().size() > 0){
            sb.append(" where 1=1");
            Set<String> keySet = params.keySet();
            for (String key : keySet) {
                sb.append(" and "+key+"=?");
                // 如果判断条件不是有等于可以如下
                // sb.append(" and " + key);
            }
        }
        
        PreparedStatement ptmt=conn.prepareStatement(sb.toString());
        System.out.println(sb.toString());
        
        if(params!=null && params.keySet().size() > 0){
            Set<String> keySet = params.keySet();
            int index = 0;
            for (String key : keySet) {
                index++;
                Object value = params.get(key);
                if(value instanceof String){
                    ptmt.setString(index, (String)value);
                }else if(value instanceof Integer){
                    ptmt.setInt(index, (Integer)value);
                }else if(value instanceof Date){
                    ptmt.setTimestamp(index, new Timestamp(((Date)value).getTime()));
                }else{
                    //......
                }
            }
        }
        
        ResultSet rs=ptmt.executeQuery();
        
        Goddess g=null;
        while(rs.next()){
            g=new Goddess();
            g.setId(rs.getInt("id"));
            g.setUser_name(rs.getString("user_name"));
            g.setAge(rs.getInt("age"));
            g.setSex(rs.getInt("sex"));
            g.setEmail(rs.getString("email"));
            g.setMobile(rs.getString("mobile"));
            result.add(g);
        }
        return result;
    }
    2019-07-17 19:50:58
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载