如何用JDBC优雅的写sql查询

630 阅读2分钟
原文链接: www.gzzysoft.cn

如何用JDBC优雅的写sql查询

/ 默认分类 / 没有评论 / 6浏览

JavaSQL

现在用JDBC直接写sql查询的人很少了,不过在某些情况下,可能你还是会需要,毕竟用底层写比较灵活。但是你肯定很讨厌一堆getConnection,PreparedStatement的代码。今天我们来探讨一下sql查询的本质。

对你来说,你需要的只是写一条sql语句,并返回结果,当然可能还需要传入一些参数。嗯,所以我们可以定义这样一个函数。

public static List<Map> getData(String sql, Object... params)

接下来就会遇到问题了,sql查询是需要知道参数及返回类型的,怎么办呢?没事,不是可以动态判断类型吗。首先我们处理一下参数传入的问题:

    for(int i=0;i<params.length;++i){
        Object o=params[i];
        if(o instanceof Integer){
            stmt.setInt(i+1, (Integer)o);
        }else if(o instanceof Double){
            stmt.setDouble(i+1, (Double)o);
        }else if(o instanceof Long){
            stmt.setLong(i+1, (Long)o);
        }else if(o instanceof java.util.Date){
            java.util.Date date=(java.util.Date)o;
            Timestamp d=new Timestamp(date.getTime());
            stmt.setTimestamp(i+1, d);
        }else if(o instanceof Date){
            Date date=(Date)o;
            Timestamp d=new Timestamp(date.getTime());
            stmt.setTimestamp(i+1, d);
        }else{
            stmt.setString(i+1, (String)o);
        }
    }

接下来就是处理返回结果了,这里我们先要把字段名取出来。

        ResultSet rs = stmt.executeQuery();
        ResultSetMetaData data = rs.getMetaData();
        while (rs.next()) {
            Map<String, Object>map=new HashMap<>();
            for (int i = 1; i <= data.getColumnCount(); i++) {

                String columnName = data.getColumnName(i);
                // 获得指定列的列值
                //int columnType = data.getColumnType(i);
                String columnTypeName=data.getColumnTypeName(i);
                if(columnTypeName.startsWith("INT")||columnTypeName.startsWith("TINYINT")||columnTypeName.startsWith("SMALLINT")){
                    map.put(columnName, rs.getInt(i));
                }else if(columnTypeName.startsWith("BIGINT")){
                    map.put(columnName, rs.getLong(i));
                }
                else if(columnTypeName.startsWith("DECIMAL")||columnTypeName.startsWith("MONEY")){
                    map.put(columnName, rs.getDouble(i));
                } else if(columnTypeName.startsWith("DATETIME")||columnTypeName.startsWith("TIMESTAMP")||columnTypeName.startsWith("DATE")||columnTypeName.startsWith("TIME")){
                    Timestamp t=rs.getTimestamp(i);
                    if(t!=null) {
                        //java.util.Date d = new java.util.Date(t.getTime());
                        map.put(columnName, t.getTime());//d);
                    }else{
                        map.put(columnName, 0L);//null);
                    }
                    //map.put(columnName, rs.getLong(i));
                }
                else{
                    /*Object o=rs.getObject(i);
                    if(o==null){
                        map.put(columnName, null);
                    }else*/{
                        map.put(columnName, rs.getString(i));
                    }
                }
            }
            list.add(map);
            map.put("xid",list.size());
        }

好了,以上就是关键代码了,完整代码在这里 git.coding.net/guodayang/m…

本文由 melody 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2019/02/15 10:55