Java連接Oracle數據庫及封裝JDBC

Java連接Oracle數據庫及封裝JDBC

如果你點開看到了這篇文章,說明你已經或多或少地通過學校學習亦或是自學瞭解了 oracle 數據庫的基本用法。但是實際在開發程序的時候,我們是不可能手動地去操作sql語句的,而是由程序去調用。這個時候,就需要使用上編程語言了。本文主要介紹的是Java連接數據庫的技術 —— JDBC。

一、JDBC???

JDBC的全稱是Java Data Base Connectivity, Java與各大數據庫相連接都是使用這門技術。各種數據庫的API各不相同,Java是如何實現統一的呢?這是因爲sun公司制定了一套標準,各大數據庫廠商依據這個標準開發出數據庫驅動程序。我們只需要使用這些驅動即可操作數據庫。

在oracle安裝目錄之下可以找到這些驅動程序
在這裏插入圖片描述
那麼多個驅動程序,該選擇哪個?

Oracle版本 jdk版本 推薦jar包 備註
Oracle 8i JDK 1.1.x classes111.zip
Oracle 8i JDK 1.1.x classes12.zip
Oracle 9i JDK 1.1.x classes111.jar或者 classes111.zip
Oracle 9i JDK 1.2 and JDK 1.3 classes12.jar 或者 classes12.zip
Oracle 9i JDK 1.4 ojdbc14.jar
Oracle 9i JDK 1.5 ojdbc5.jar
Oracle 9i JDK 1.6 ojdbc6.jar
Oracle 10g JDK 1.2 and JDK 1.3. classes12.jar
Oracle 10g JDK 1.4 and 5.0 ojdbc14.jar
Oracle 11g jdk5 ojdbc5.jar
Oracle 11g jdk6 ojdbc6.jar

按照oracle版本和jdk版本選擇,這裏的表格僅作參考。

二、連接!!!

說的太多也沒用,直接上一段程序體驗一下。只需要準備一個IDE(eclipse、IDEA等)和上面所說的驅動程序即可。

創建項目

首先,創建一個普通的Java項目,引入jar包。(我這裏是放在了jbdc_oracle目錄下)最後把鼠標移到ojdbc.jar,右鍵,bulild path,add to build path

在這裏插入圖片描述

IDEA創建的項目同理(Add to libary),會使用Maven的也可以創建Maven項目,在pom文件引入依賴即可。

編寫代碼

import java.sql.*;

public class Main {

    public static void main(String[] args) {
        try {
            // 1.加載驅動
            Class.forName("oracle.jdbc.driver.OracleDriver");
            // 2.獲取連接
            Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
            System.out.println(connection.getMetaData());
            // 3.創建Statement對象(可以執行sql的對象)
            PreparedStatement preparedStatement = connection.prepareStatement("select * from dept");
            // 4.獲取結果集
            ResultSet resultSet = preparedStatement.executeQuery();
            // 5.對數據進行處理
            while(resultSet.next()) {
                Integer id = resultSet.getInt("DEPTNO");
                String dname = resultSet.getString("DNAME");
                String location = resultSet.getString("LOC");
                System.out.println(id+" "+dname+" "+location);
            }
            // 6.關閉連接 先調用的最後關閉 關閉前判斷是否存在
           if(resultSet != null) {
                resultSet.close();
            }
            if(preparedStatement != null) {
                preparedStatement.close();
            }
            if(connection != null) {
                connection.close();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

接下來對以上代碼進行一一說明

  • 加載驅動,這裏是固定寫法,包名不要寫錯

     Class.forName("oracle.jdbc.driver.OracleDriver");
    

    其實寫法不止這一種,只是比較推薦這種。感興趣的可以看看官方的寫法:

    官方JDBC的連接

  • 獲取連接

     Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
    

    getConnection()裏面的三個參數分別是url地址,用戶名和密碼

    jdbc:oracle:thin:固定寫法,其中thin表示連接數據庫的一種方式,想進一步瞭解的話,文末有參考地址

    127.0.0.1:ip地址,這裏表示本機

    1521:oracle的端口地址,一般安裝後默認爲1521

    orcl:數據庫的實例名稱,一般安裝後默認有一個orcl

在這裏插入圖片描述

JDBC常見的對象

注:以下方法都省略了函數的參數

Connection

意如其名,就是表示數據庫和Java之間的一個連接,所有的數據庫操作都與其密切相關。

prepareStatement();//PreparedStatement對象
createStatement();//Statement對象
commit();        //提交
rollback();      //回滾
prepareCall();   //存儲過程

Statement

executeQuery(); //查詢,返回ResultSet
executeUpdate(); //增加、刪除、更新,返回受影響的行數
/* @return  <code>true</code> if the first result is a <code>ResultSet</code>
 *         object; <code>false</code> if it is an update count or there are
 *         no results
 */ 
execute();//增刪改查都可以進行,不建議使用

PreparedStatement

PreparedStatement是Statement的子類,PreparedStatement對象可以對sql語句進行預編譯,並且可以通過佔位符的方式方便我們進行參數的拼接:

PreparedStatement preparedStatement = connection.prepareStatement("select * from dept where deptno=?");
preparedStatement.setInt(1,10); //int對應deptno的類型,1代表第1個問號,

ResultSet

查詢後獲得的結果集

getXXX(數據庫的列名/第幾列)  //其中XXX可以是Int,Array,Boolean等
 /*
 第幾列對應的是sql中的第幾列,
 如select deptno,loc,dname from dept;
 寫法:getInt(1) / getInt("deptno")
 select loc,dname,deptno from dept;
 寫法:getInt(3) / getInt("deptno");

這幾個對象多調用幾次就知道如何使用了,總的使用流程是

連接數據庫(獲取Connection對象) -> 創建Statement對象(Statement/PreparedStatement) -> 用Statement對象執行語句(execute/executeUpdate/executeQuery) -> 利用返回值(execute返回true/false,executeUpdate返回受影響行數,executeQuery返回ResultSet)判斷執行的結果 -> 關閉對象

多多使用就對了!

三、封裝

僅供參考,建議先熟悉以上操作後再根據實際情況使用。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {
	
	private final static String DRIVER = "oracle.jdbc.driver.OracleDriver";
	private final static String URL = "jdbc:oracle:thin:@//127.0.0.1:1521/orcl";
	private final static String USERNAME = "scott";
	private final static String PWD = "tiger";
	
	public static Connection connection = null;
    static Statement stmt = null;
	public static PreparedStatement pstmt = null;
	private static ResultSet rs;
	
    static {
    	try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    }
    
  //單例模式返回數據庫連接對象
  	public static Connection getConnection() throws Exception
  	{
  		if(connection==null)
  		{
  			connection = DriverManager.getConnection(URL, USERNAME,PWD);
  			return connection;
  		}
  		return connection;
  	}
  	
  	public static Statement getStatement() throws Exception {
  		Connection conn = getConnection();
  		try {
  			if(conn!=null) {
  				stmt = conn.createStatement();
  			}
  		}catch(Exception e) {
  			e.printStackTrace();
  		}
  		return stmt;
  	}
	
	//查詢總數
	public static int getTotalCount(String sql) { //select count(1) from student
		int count = -1 ;
		try {
			 pstmt = createPreParedStatement(sql, null );
			 rs = pstmt.executeQuery()  ;//88
			if(rs.next()) {
				count = rs.getInt(1) ;
			}
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			closeAll(rs, pstmt, connection);
		}
		return count;
	}
	
	//通用的增刪改
	public static boolean executeUpdate(String sql,Object[] params) {//{"zs",1}
		try {  
			  pstmt = createPreParedStatement(sql,params);
			  int count = pstmt.executeUpdate() ;
			  if(count>0)
				  return true ;
			  else 
				  return false ;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			  return false ;
		} catch (SQLException e) {
			e.printStackTrace();
			  return false ;
		}catch (Exception e) {
			e.printStackTrace();
			return false ;
		}
		finally {
			closeAll(null,pstmt,connection);
		}
	}
	
	//Statement
	public static void closeAll(ResultSet rs,Statement stmt,Connection connection)
	{
		try {
			if(rs!=null)rs.close();
			if(pstmt!=null)pstmt.close();
			if(connection!=null)connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
		
	public static PreparedStatement createPreParedStatement(String sql,Object[] params) throws Exception {
		  pstmt = getConnection() .prepareStatement(sql) ;
		  if(params!=null ) {
			  for(int i=0;i<params.length;i++) {
				  pstmt.setObject(i+1, params[i]);
			  }
		  }
		  return pstmt;
	}
	
	//通用的查:通用表示適合於 任何查詢
	public static ResultSet executeQuery(String sql,Object[] params) {
		try {
			pstmt = createPreParedStatement(sql,params);
			rs =  pstmt.executeQuery() ;
			return rs ;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null ; 
		} catch (SQLException e) {
			e.printStackTrace();
			return null ; 
		}catch (Exception e) {
			e.printStackTrace();
			return null ; 
		}
	}
}

使用示例

public class Main {
	public static void main(String[] args) throws SQLException {
		// 查詢示例1
		ResultSet rs1 = DBUtil.executeQuery("select * from dept where deptno = ?", new Object[] {10});
		if(rs1.next()) {
			System.out.println(rs1.getInt(1)+" "+rs1.getString(2)+" "+rs1.getString(3));
		}
		// 更新示例1
		boolean rs2 = DBUtil.executeUpdate("update dept set loc = ? where deptno = ?", new Object[] {"Japan",10});
		if(rs2) {
			System.out.println("更新成功!");
		}
	}
}

參考資料:

oracle jdbc選擇

JDBC連接數據庫三種url方式

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