1. 程式人生 > >Java操作Oracle

Java操作Oracle

Java操作Oracle

JDBC-ODBC橋連(此方式連線無需開啟監聽服務)

// 關鍵程式碼,這裡是和操作SQLServer不同的
// 載入驅動
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// 獲得連線
Connection ct=DriverManager.getConnection("jdbc:odbc:myoracledb","scott","123456");

JDBC-ODBC明:

sun.jdbc.odbc.JdbcOdbcDriver此驅動由原sun司提供

"jdbc:odbc:myoracledb","scott","123456"

Jdbc:odbc:資料來源名稱,"使用者名稱","密碼"

PS:關於資料來源的配置,可以百度。

/**
 * jdbc_odbc橋連線Oracle
 */
package com.oracle.db;

import java.sql.*;

public class db1 {
	Connection ct = null;
	PreparedStatement ps = null;
	ResultSet rs = null;

	public db1() {
		try {
			// 1.載入驅動
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			// 2.得到連線
			ct = DriverManager.getConnection("jdbc:odbc:myoracledb", "scott",
					"123456");
			// 3.建立PreparedStatement
			ps = ct.prepareStatement("select * from emp");
			// 4.執行SQL
			rs = ps.executeQuery();
			// 5.對獲取的資料進行操作
			while (rs.next()) {
				System.out.println("員工名:" + rs.getString("ename"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (ps != null) {
					ps.close();
				}
				if (ct != null) {
					ct.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		db1 d1 = new db1();
	}
}

JDBC直連(此方式連線需要開啟服務中的監聽服務)

// 關鍵程式碼,這裡是和操作SQLServer不同的
// 載入驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
// 獲得連線
ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:Switch","scott","123456");

JDBC明:

oracle.jdbc.driver.OracleDriver此驅動由oracle提供

"jdbc:oracle:thin:@127.0.0.1:1521:Switch","scott","123456"

Jdbc:oracle:thin:@ip址:口號預設1521:例項名,"使用者名稱","密碼"

/**
 * 使用jdbc直連Oracle
 */
package com.oracle.db;

import java.sql.*;

public class db2 {
	Connection ct = null;
	PreparedStatement ps = null;
	ResultSet rs = null;

	public db2() {
		try {
			// 1.載入驅動
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 2.得到連線
			ct = DriverManager.getConnection(
					"jdbc:oracle:thin:@127.0.0.1:1521:Switch", "scott",
					"123456");
			// 3.建立PreparedStatement
			ps = ct.prepareStatement("select * from emp");
			// 4.執行SQL
			rs = ps.executeQuery();
			// 5.對獲取的資料進行操作
			while (rs.next()) {
				System.out.println("員工名:" + rs.getString("ename"));
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (ps != null) {
					ps.close();
				}
				if (ct != null) {
					ct.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		db2 d1 = new db2();
	}
}

什麼時候使用jdbcjdbc-odbc

原則:

如果java程式和資料庫不在同一臺機器上,我們一般使用jdbc如果java程式和資料庫在同一臺機器上,則兩個都可以使用。

資料庫伺服器使用的系統不同使用的連線方式也不同,如果是linuxunix服務器,則使用jdbc。如果是windows server服務器則使兩個都可以使用。



擴充套件:

CRUD操作的程式碼重構,如果直接將CRUD寫入業務邏輯程式碼中會造成業務邏輯不清晰,甚至是混亂。在稍大型一點的軟體開發中,都會選擇將CRUD封裝到一個類中,這樣邏輯層和控制層就分離開了。這裡以SQLHelpter類為例。

package com.oracle.test;

import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;

public class SQLHelper {
	//定義三個變數
	private static Connection ct=null;
	private static PreparedStatement ps=null;
	private static ResultSet rs=null;
	
	//連線資料庫的使用者名稱,密碼,url,驅動
	//說明:在實際開發中,我們往往把這些變數寫到一個外部檔案中
	//當程式啟動時,我們讀入這些配置資訊。java.util.Properites
	private static String username;
	private static String password;
	private static String driver;
	private static String url;

	//使用靜態塊載入驅動(驅動只需要載入一次)
	static{
    //使用Properties類,來讀取配置檔案
		Properties pp=new Properties();
		FileInputStream fis=null;
		try {
			fis=new FileInputStream("dbinfo.properties");
			//讓pp與dbinfo.properties檔案關聯起來
			pp.load(fis);
			//獲取dbinfo.properties檔案內資訊
			username=(String) pp.getProperty("username");
			password=(String) pp.getProperty("password");
			driver=(String) pp.getProperty("driver");
			url=(String) pp.getProperty("url");
			
			//獲得驅動
			Class.forName(driver);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(fis!=null){
					fis.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			fis=null;
		}
	}
	
	//統一的curd操作
	public static void executeUpdate(String sql,String[] parameters){
		try {
			ct=DriverManager.getConnection(url,username,password);
			ps=ct.prepareStatement(sql);
			if(parameters!=null){
				for(int i=0;i<parameters.length;i++){
					ps.setString(i+1, parameters[i]);
				}
			}
			//執行
			ps.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e.getMessage());
		}finally{
			close(rs,ps,ct);
		}
	}
	
	//寫一個方法,完成查詢任務
	//sql表示要執行的sql語句
	//sql select * from emp where ename=?
	public static ResultSet executeQuery(String sql,String[] parameters){
		try {
			//根據實際情況我們對sql語句?賦值
			//得到連線
			ct=DriverManager.getConnection(url,username,password);
			//建立ps物件,得到sql語句物件
			ps=ct.prepareStatement(sql);
			//如果parameters不為null,才賦值
			if(parameters!=null){
				for(int i=0;i<parameters.length;i++){
					ps.setString(i+1, parameters[i]);
				}
			}
			rs=ps.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
			//丟擲執行異常
			throw new RuntimeException(e.getMessage());
		} finally{
			//close(rs,ps,ct);
		}
		return rs;
	}
	
	//把關閉資源寫成函式
	public static void close(ResultSet rs,Statement ps,Connection ct){
		//關閉資源
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs=null;
		}
		if(ps!=null){
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			ps=null;
		}
		if(ct!=null){
			try {
				ct.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			ct=null;
		}
	}
	
	public static Connection getCt() {
		return ct;
	}

	public static PreparedStatement getPs() {
		return ps;
	}
}

[dbinfo.properties]檔案,資料庫連線相關資訊

username=scott

password=123456

driver=oracle.jdbc.driver.OracleDriver

url=jdbc\:oracle\:thin\:@127.0.0.1\:1521\:Switch


PS:像以上這麼將CRUD分離就會方便很多,用起來直接呼叫就行了。這裡的資料庫連線資訊做成了一個檔案,從檔案中讀取連線資訊,這樣方便呼叫也方便修改。連線資訊是通過Properties類和輸入檔案流來進行讀取的。


例項:實現分頁功能的jsp

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
</head>

<body>
	<h2>oracle分頁案例</h2>
	<br>
	<table>
	<tr><td>使用者名稱</td><td>薪水</td></tr>
	<%
	try {
			// 1.載入驅動
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 2.得到連線
			Connection ct = DriverManager.getConnection(
					"jdbc:oracle:thin:@127.0.0.1:1521:Switch", "scott",
					"123456");
			// 3.建立PreparedStatement
			//接收pageNow
			String s_pageNow = (String)request.getParameter("pageNow");
			int pageNow = 1;
			if(s_pageNow != null){
				pageNow = Integer.parseInt(s_pageNow);
			}
			
			// 查詢總頁數
			int pageCount = 0;	//頁總數
			int rowCount = 0;	//共有幾條記錄
			int pageSize = 5;	//每頁顯示幾條
            //通過查詢總記錄計算出總頁數
			PreparedStatement ps = ct.prepareStatement("select count(*) from emp");
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				rowCount = rs.getInt(1);
				if(rowCount % pageSize == 0){
					pageCount = rowCount / pageSize;
				} else {
					pageCount = rowCount / pageSize + 1;
				}
			}
			//分頁查詢-可以參考我的部落格Oracle表管理
			ps = ct.prepareStatement("select * from (select e1.*,rownum rn from (select * from emp) e1 where rownum <= " + (pageNow*pageSize) +") where rn >=" + ((pageNow-1)*pageSize+1) +"");
			// 4.執行SQL
			rs = ps.executeQuery();
			// 5.對獲取的資料進行操作
			
			while (rs.next()) {
				out.println("<tr>");
				out.println("<td>" + rs.getString("ename") + "</td>");
				out.println("<td>" + rs.getString("sal") + "</td>");
				out.println("</tr>");
			}
    out.println(“</table>”);
			//列印總頁數
			for(int i = 1; i <= pageCount; i++){
				out.print("<a href=index.jsp?pageNow="+i+ "> [" + i +  "] </a>");
			}
			rs.close();
			ps.close();
			ct.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 %>
</body>
</html>


----------參考《韓順平玩轉Oracle》