关于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;
    }
阅读 2.5k
2 个回答

首先,请你告诉我你使用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;
}

你写的代码看了一下,你看可不可以改成这样,把query的形参改成String类型,用于接收查询条件:

public List<Goddess> query(String conditions) throws Exception{...}

然后,查询条件直接写进一个字符串中,例如:

String conditions = "user_name='小美' and mobile=18712345678 and age=33";

这样的话写起来就简便一些了,而且query方法也不需要对map进行遍历构造查询字符串了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏