1. 程式人生 > >java之對JDBC的完整封裝(相容多種資料庫)

java之對JDBC的完整封裝(相容多種資料庫)

目前此程式碼我只用過mysql和oracle資料庫測試過,但相信其它資料庫都是可以的,只要匯入你需要操作的資料庫jar包,驅動等就可,下面上程式碼:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 對jdbc的完整封裝
 *
 */
public class JDBCUtil {

	private static  String driver = null;
	private static  String url = null;
	private static  String username = null;
	private static  String password = null;
	
	private CallableStatement callableStatement = null;//建立CallableStatement物件      
	private Connection conn = null;
	private PreparedStatement pst = null;
	private ResultSet rst = null;
	
/*	static {    
        try {    
            // 載入資料庫驅動程式    
            Class.forName(driver);    
        } catch (ClassNotFoundException e) {    
            System.out.println("載入驅動錯誤");    
            System.out.println(e.getMessage());    
        }    
    } */   
    
	public JDBCUtil(String driver,String url ,String username,String password) {
		this.driver = driver;
		this.url = url;
		this.username = username;
		this.password = password;
	}
	
    /**  
     * 建立資料庫連線  
     * @return 資料庫連線  
     */    
    public Connection getConnection() {    
        try {    
        	 // 載入資料庫驅動程式    
            try {
				Class.forName(driver);
			} catch (ClassNotFoundException e) {
				System.out.println("載入驅動錯誤");    
	            System.out.println(e.getMessage());  
				e.printStackTrace();
			} 
            // 獲取連線    
        	conn = DriverManager.getConnection(url, username,    
        			password);    
        } catch (SQLException e) {    
            System.out.println(e.getMessage());    
        }    
        return conn;    
    }    
    
    /**  
     * insert update delete SQL語句的執行的統一方法  
     * @param sql SQL語句  
     * @param params 引數陣列,若沒有引數則為null  
     * @return 受影響的行數  
     */    
    public int executeUpdate(String sql, Object[] params) {    
        // 受影響的行數    
        int affectedLine = 0;    
            
        try {    
            // 獲得連線    
            conn = this.getConnection();    
            // 呼叫SQL     
            pst = conn.prepareStatement(sql);    
                
            // 引數賦值    
            if (params != null) {    
                for (int i = 0; i < params.length; i++) {    
                	pst.setObject(i + 1, params[i]);    
                }    
            }    
            /*在此 PreparedStatement 物件中執行 SQL 語句,
                                          該語句必須是一個 SQL 資料操作語言(Data Manipulation Language,DML)語句,比如 INSERT、UPDATE 或 DELETE 
                                          語句;或者是無返回內容的 SQL 語句,比如 DDL 語句。    */
            // 執行    
            affectedLine = pst.executeUpdate();
    
        } catch (SQLException e) {    
            System.out.println(e.getMessage());    
        } finally {    
            // 釋放資源    
            closeAll();    
        }    
        return affectedLine;    
    }    
    
    /**  
     * SQL 查詢將查詢結果直接放入ResultSet中  
     * @param sql SQL語句  
     * @param params 引數陣列,若沒有引數則為null  
     * @return 結果集  
     */    
    private ResultSet executeQueryRS(String sql, Object[] params) {    
        try {    
            // 獲得連線    
            conn = this.getConnection();    
                
            // 呼叫SQL    
            pst = conn.prepareStatement(sql);    
                
            // 引數賦值    
            if (params != null) {    
                for (int i = 0; i < params.length; i++) {    
                	pst.setObject(i + 1, params[i]);    
                }    
            }    
                
            // 執行    
            rst = pst.executeQuery();    
    
        } catch (SQLException e) {    
            System.out.println(e.getMessage());    
        }     
    
        return rst;    
    }    
        
    /**  
     * SQL 查詢將查詢結果:一行一列  
     * @param sql SQL語句  
     * @param params 引數陣列,若沒有引數則為null  
     * @return 結果集  
     */    
    public Object executeQuerySingle(String sql, Object[] params) {    
        Object object = null;    
        try {    
            // 獲得連線    
            conn = this.getConnection();    
                
            // 呼叫SQL    
            pst = conn.prepareStatement(sql);    
                
            // 引數賦值    
            if (params != null) {    
                for (int i = 0; i < params.length; i++) {    
                	pst.setObject(i + 1, params[i]);    
                }    
            }    
                
            // 執行    
            rst = pst.executeQuery();    
    
            if(rst.next()) {    
                object = rst.getObject(1);    
            }    
                
        } catch (SQLException e) {    
            System.out.println(e.getMessage());    
        } finally {    
            closeAll();    
        }    
    
        return object;    
    }    
    
    /**  
     * 獲取結果集,並將結果放在List中  
     *   
     * @param sql  SQL語句  
     *         params  引數,沒有則為null   
     * @return List  
     *                       結果集  
     */    
    public List<Object> excuteQuery(String sql, Object[] params) {    
        // 執行SQL獲得結果集    
        ResultSet rs = executeQueryRS(sql, params);    
            
        // 建立ResultSetMetaData物件    
        ResultSetMetaData rsmd = null;    
            
        // 結果集列數    
        int columnCount = 0;    
        try {    
            rsmd = rs.getMetaData();    
                
            // 獲得結果集列數    
            columnCount = rsmd.getColumnCount();    
        } catch (SQLException e1) {    
            System.out.println(e1.getMessage());    
        }    
    
        // 建立List    
        List<Object> list = new ArrayList<Object>();    
    
        try {    
            // 將ResultSet的結果儲存到List中    
            while (rs.next()) {    
                Map<String, Object> map = new HashMap<String, Object>();    
                for (int i = 1; i <= columnCount; i++) {    
                    map.put(rsmd.getColumnLabel(i), rs.getObject(i));    
                }    
                list.add(map);//每一個map代表一條記錄,把所有記錄存在list中    
            }    
        } catch (SQLException e) {    
            System.out.println(e.getMessage());    
        } finally {    
            // 關閉所有資源    
            closeAll();    
        }    
    
        return list;    
    }    
        
    /**  
     * 儲存過程帶有一個輸出引數的方法  
     * @param sql 儲存過程語句  
     * @param params 引數陣列  
     * @param outParamPos 輸出引數位置  
     * @param SqlType 輸出引數型別  
     * @return 輸出引數的值  
     */    
    public Object excuteQuery(String sql, Object[] params,int outParamPos, int SqlType) {    
        Object object = null;    
        conn = this.getConnection();    
        try {    
            // 呼叫儲存過程    
        	// prepareCall:建立一個 CallableStatement 物件來呼叫資料庫儲存過程。
            callableStatement = conn.prepareCall(sql);    
                
            // 給引數賦值    
            if(params != null) {    
                for(int i = 0; i < params.length; i++) {    
                    callableStatement.setObject(i + 1, params[i]);    
                }    
            }    
                
            // 註冊輸出引數    
            callableStatement.registerOutParameter(outParamPos, SqlType);    
                
            // 執行    
            callableStatement.execute();    
                
            // 得到輸出引數    
            object = callableStatement.getObject(outParamPos);    
                
        } catch (SQLException e) {    
            System.out.println(e.getMessage());    
        } finally {    
            // 釋放資源    
            closeAll();    
        }    
            
        return object;    
    }    
    
    /**  
     * 關閉所有資源  
     */    
    private void closeAll() {    
        // 關閉結果集物件    
        if (rst != null) {    
            try {    
                rst.close();    
            } catch (SQLException e) {    
                System.out.println(e.getMessage());    
            }    
        }    
    
        // 關閉PreparedStatement物件    
        if (pst != null) {    
            try {    
                pst.close();    
            } catch (SQLException e) {    
                System.out.println(e.getMessage());    
            }    
        }    
            
        // 關閉CallableStatement 物件    
        if (callableStatement != null) {    
            try {    
                callableStatement.close();    
            } catch (SQLException e) {    
                System.out.println(e.getMessage());    
            }    
        }    
    
        // 關閉Connection 物件    
        if (conn != null) {    
            try {    
                conn.close();    
            } catch (SQLException e) {    
                System.out.println(e.getMessage());    
            }    
        }       
    }    
}


使用的時候直接new一個JDBCUtil類,然後對傳入對應的sql語句,例:


在此我就不一一截圖了,偷個懶!!!