java jdbc數據庫連接簡單封裝


ORM這一塊一直用第三方框架,都忘記原生jdbc怎么寫了,花了幾個小時回憶整理一下。

引用jar:mysql-connector-java-5.0.5-bin.jar

 

創建公用私有變量

    public static final String url = "jdbc:mysql://127.0.0.1/oneshop";
    public static final String name = "com.mysql.jdbc.Driver";
    public static final String user = "root";
    public static final String password = "root";
    public Connection conn = null;
    private PreparedStatement pst = null;
    private ResultSet rs;

 

構造函數實例化打開連接 

public DB() throws ClassNotFoundException, SQLException {
        Class.forName(name);// 指定連接類型
        if (conn == null)
            conn = DriverManager.getConnection(url, user, password);// 獲取連接
    }

 

關閉連接

public void close() throws SQLException {
        if (conn != null)
            conn.close();
        if (pst != null)
            pst.close();
        if (rs != null)
            rs.close();
    }

 

執行sql方法

public Boolean execute(String sql, String... params) {
        boolean bool = false;
        try {
            pst = conn.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                pst.setString((i + 1), params[i]);
            }
            bool = pst.execute();
            this.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return bool;
    }

 

查詢返回一條數據

public Map<String, Object> get(String sql, String... params)
            throws SQLException {
        pst = conn.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            pst.setString((i + 1), params[i]);
        }
        rs = pst.executeQuery();
        Map<String, Object> map = new HashMap<String, Object>();
        ResultSetMetaData rsmd = pst.getMetaData();
        int col = rsmd.getColumnCount();
        while (rs.next()) {
            for (int i = 1; i < col; i++) {
                map.put(rsmd.getColumnName(i), rs.getObject(i));
            }
        }
        this.close();
        return map;
    }

 

查詢返回集合

public List<Map<String, Object>> List(String sql, String... params)
            throws SQLException {
        pst = conn.prepareStatement(sql);
        for (int i = 0; i < params.length; i++) {
            pst.setString((i + 1), params[i]);
        }
        rs = pst.executeQuery();
        List<Map<String, Object>> rList = new ArrayList<Map<String, Object>>();
        Map<String, Object> map;
        ResultSetMetaData rsmd = pst.getMetaData();
        int col = rsmd.getColumnCount();
        while (rs.next()) {
            map = new HashMap<String, Object>();
            for (int i = 1; i < col; i++) {
                map.put(rsmd.getColumnName(i), rs.getObject(i));
            }
            rList.add(map);
        }
        return rList;
    }

 

我們常用返回的是實體,而不是map,所以使用了JSONArray

不過這個需要引用很多jar

分別是:

  json-lib-2.4-jdk15.jar

  ezmorph-1.0.6.jar

  commons-beanutils-1.8.3.jar

  commons-collections-3.2.1.jar

  commons-codec-1.6.jar  

  commons-io-2.2.jar

  commons-lang-2.6.jar

  commons-logging-1.1.1.jar

  這么一大堆jar是個什么鬼?現在可是輕量級服務,怎么能有這么多,,本人表示很煩,決定后面有時間寫一個,不過這里就算了,以后再說吧(偷個懶....)

  

  單個查詢

  

public <T> T getEntity(String sql, Class<T> t) throws SQLException {
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();
        Map<String, Object> map = get(sql);
        JSONArray jr = JSONArray.fromObject(map);
        @SuppressWarnings("unchecked")
        T result = (T) JSONArray.toCollection(jr, t);
        return result;
    }

 

 查詢返回集合

public <T> List<T> getList(String sql, Class<T> t) throws SQLException {
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();
        List<Map<String, Object>> rList = List(sql);
        JSONArray jr = JSONArray.fromObject(rList);
        @SuppressWarnings("unchecked")
        List<T> resultList = (List<T>) JSONArray.toCollection(jr, t);
        return resultList;
    }

 

這樣寫返回實體有2個限制:

  1.實體字段名必須與查詢返回的字段名一致,否則無法賦值。

  2.只能查詢當前實體

果然還是只能自己寫一個,思路也大概有了:

   1.給實體添加注解,通過反射找到實體字段名與數據庫對應字段名,從而解決第一個問題。

   2.外鍵關聯的字段可以通過查詢的時候as 表名.列名 去解析賦值,解決第二個問題。

嗯,就是這樣。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM