Java實現Oracle連接的DbHelper及相關異常

Java中使用DbHeplper來連接Oracle數據庫時,一般可以分爲以下幾個步驟:
第一步,導入sql包;
第二步,將Oracle中的Java驅動包添加到項目下,並生成路徑,Java驅動包存放在路徑:F:\oracle\product\10.2.0\db_1\jdbc\lib之下;
第三步,加載驅動;
第四步,使用驅動管理器獲取數據庫連接對象;
第五步,編寫sql語句(事先在數據庫中編譯通過的正確的sql語句);
第六步,創建語句對象;
第七步,執行sql語句,返回ResultSet結果集對象;
第八步,關閉對象,Connection,PreparedStatement,ResultSet。

代碼如下:
package jdbcDemo1;
/**
 * jdbc
 * @author 阿達
 *
 */
//第一步 導入SQL包
import java.sql.*;
public class Test1 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //第二步:將驅動包放到項目下
        //第三步:加載驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //第四步 :驅動管理器獲取數據庫連接對象
        //url:數據庫服務器地址:jdbc:oracle:thin:@主機IP:數據庫端口:數據庫實例
        Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "a");
        //測試:是否獲取到連接對象
        System.out.println(conn.getClass().getName());
        //第五步:編寫SQL語句
        String sql="select * from emp";
        //第六步:創建語句對象(將 SQL 語句發送到數據庫)
        Statement stmt=conn.createStatement();
        //第七步:執行sql語句,返回ResultSet結果集對象
        ResultSet rs=stmt.executeQuery(sql);
        while(rs.next()){//判斷下一行是否有數據
            System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getInt(4)+"\t");
            //如果SQL語句中的字段順序發生改變,則需要對結果集進行重新編號
        }
        //第七步:關閉流對象,釋放內存
        //關閉對象
        //關閉結果集對象
        rs.close();
        //關閉語句對象
        stmt.close();
        //關閉連接對象;
        conn.close();
    }
}


常見異常有:
1.java.sql.SQLException: Io 異常: The Network Adapter could not establish the connection
  原因:Oralce數據庫的主服務和監聽服務沒有開啓,在服務中開啓OracleServiceORCL和OracleOraDb10g_home1TNSListener服務即可。
2." java.lang.ClassNotFoundException: oracle.jdbc.driver.OarcleDriver
  原因:1.沒有將驅動包放到項目下 2.Class 類中的 forName 方法出錯。
3. java.sql.SQLException: No suitable driver found for jdbc:orale:thin:@127.0.0.1:1521:orcl
  原因:驅動管理器獲取數據庫連接對象出錯,正確應爲:jdbc:oracle:thin:@127.0.0.1:1521:orcl。
4.ExceptionInInitializerError
  原因:forName方法所激發的初始化失敗
5.java.sql.SQLException: ORA-00900: 無效 SQL 語句
  原因:SQL 語句不正確,建議sql語句先在Oracle中運行無誤後再寫入代碼中。


附:爲了便於平時的使用,我們可以對DbHelper進行封裝處理.首先創建一個db.properties文件存儲的驅動信息和數據庫連接對象時所要使用到的信息,
    再自定義一個單例模式的MyProperties類繼承Properties,調用db.properties中存儲的驅動信息和數據庫連接對象時所要使用到的信息。最後DbHelper調用MyProperties獲取所需信息。
MyProperties.java的代碼如下:
package jdbcDemo2;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
 * 自定義MyProperties類繼承Properties,當前類擁有Properties公共屬性和方法
 * @author 阿達
 * 整個系統只需要創建一個對象
 * 設計成單例模式
 */
public class MyProperties extends Properties{
    private static MyProperties myProperties ;
    private MyProperties() throws IOException{
        InputStream in=MyProperties.class.getClassLoader().getResourceAsStream("jdbcDemo2/db.properties");
        this.load(in); //從輸入流中讀取屬性列表(鍵和元素對)
    }
    public static MyProperties getInstance() throws IOException {
        if(null==myProperties){
            myProperties=new MyProperties();
        }
        return myProperties;
    }
}

db.properties的代碼如下:
driverName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
user=scott
password=a

DbHelper.java的代碼如下:
package jdbcDemo2;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DbHelper4 {
    private Connection conn=null;
    private PreparedStatement pstmt=null;
    private ResultSet rs=null;
    //加載驅動
    static{
        try {
            Class.forName(MyProperties.getInstance().getProperty("driverName"));
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //獲取數據庫連接對象
    public Connection getConn(){
        try {
            //getConnection(url,properties)
            conn=DriverManager.getConnection(MyProperties.getInstance().getProperty("url"),MyProperties.getInstance()    );
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;

    }
    // 關閉對象
    public void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs){
        if(null!=rs){//關閉結果集
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(null!=pstmt){//關閉語句對象
            try {
                pstmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(null!=conn){//關閉連接對象
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    /*
     * 設置參數
     * @param pstmt 預編譯對象
     * @param params 外部傳入的參數值  添加值時順序一樣要和?對應值得順序一致
     *     
     */
    public void setparams(PreparedStatement pstmt,List<Object> params) throws SQLException{
        if(null!=params&&params.size()>0){
            for(int i=0;i<params.size();i++){
                pstmt.setObject(i+1, params.get(i));//設置?值
            }
        }

    }

   //獲取結果集中的所有列表
    private List<String> getAllColumnName(ResultSet rs2) throws SQLException {
        // TODO Auto-generated method stub
        List<String> columnNames=new ArrayList<String>();
        ResultSetMetaData dd=rs.getMetaData();
        for(int i=1;i<=dd.getColumnCount();i++){
            columnNames.add(dd.getColumnName(i));
        }
        return columnNames;
    }


    // 查看操作:sql語句可以查看多條記錄
    public List<Map<String,Object>> findMultObject(String sql,List<Object>params) throws SQLException{
        List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
        Map<String,Object> map=null;
        try {
            conn=this.getConn();
            pstmt=conn.prepareStatement(sql);
            this.setparams(pstmt, params);
            rs=pstmt.executeQuery();
            //獲取結果集中的所有列名
            List<String> columnNames=getAllColumnName(rs);
            while(rs.next()){
                map=new HashMap<String,Object>();
                for(String name:columnNames){
                    map.put(name, rs.getObject(name));
                }
                list.add(map);
            }
        } finally {
            this.closeAll(conn, pstmt, rs);
        }
        return list;
    }
    
    //查詢操作,select * from emp where id=? 只有一條結果
    public Map<String,Object> findSingleOBject(String sql,List<Object> params) throws SQLException{
        Map<String,Object> map=null;
        try {
            conn=this.getConn();
            pstmt=conn.prepareStatement(sql);
            this.setparams(pstmt, params);
            rs=pstmt.executeQuery();
            //獲取結果集中的所有列名
            List<String> columnNames=getAllColumnName(rs);
            if(rs.next()){
                map=new HashMap<String,Object>();
                for(String name:columnNames){
                    map.put(name, rs.getObject(name));
                }
            }
        } finally {
            // TODO: handle finally clause
            this.closeAll(conn, pstmt, rs);
        }
        return map;
    }
        

    
    //單條sql語句 更新操作:增 刪 改
    public int doUpdate(String sql,List<Object> params) throws SQLException{
        int result=0;
        try {
            conn=this.getConn();
            pstmt=conn.prepareStatement(sql);
            //設置參數
            this.setparams(pstmt, params);
            result =pstmt.executeUpdate();
            
        } finally {
            // TODO: handle finally clause
            this.closeAll(conn, pstmt, null);
        }
        return result;
    }
    
    /**
     * 多條語句的更新操作  批處理  注意:這些sql語句執行的結果要麼一起成功要麼一起失敗
     * @param sqls
     * @param params        對應每一條sql語句所需要的參數集合
     * @return
     * @throws SQLException
     */
    public int doUpdate(List<String> sqls,List<List<Object>> params) throws SQLException{
        int result=0;
        try {
            conn=this.getConn();
            //設置事物提交方式爲手動提交
            conn.setAutoCommit(false);
            if(null!=sqls&&sqls.size()>0){
                //對sql語句進行循環
                for(int i=0;i<sqls.size();i++){
                    String sql=sqls.get(i);
                    pstmt=conn.prepareStatement(sql);
                    this.setparams(pstmt, params.get(i));//第幾條sql語句對應list集合中的第一個list
                    result=pstmt.executeUpdate();
                }
            }
            conn.commit();//手動提交事物
        } catch (Exception e) {
            // TODO: handle exception
            conn.rollback();//事物回滾
        }finally{
            conn.setAutoCommit(true);//回覆事物
            this.closeAll(conn, pstmt, rs);
        }
        return result;
    }
    
    //聚合函數
    public double getCount(String sql,List<Object>params) throws SQLException{
        double result=0;
        try {
            conn=this.getConn();
            pstmt=conn.prepareStatement(sql);
            setparams(pstmt,params);
            rs=pstmt.executeQuery();
            if(rs.next()){
                result=rs.getDouble(1); //獲取第一列的值
            }
        } finally {
            // TODO: handle finally clause
            this.closeAll(conn, pstmt, rs);
        }
        return result;
    }    
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章