## Java操作Oracle
PS:之前寫的關于Java操作SQLserver數據庫的博客和數據庫基礎的博客[http://blog.csdn.net/q547550831/article/details/49930537](http://blog.csdn.net/q547550831/article/details/49930537)
[http://blog.csdn.net/q547550831/article/details/49925137](http://blog.csdn.net/q547550831/article/details/49925137)

### 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();
}
}
~~~
### 什么時候使用jdbc,jdbc-odbc?
原則:
如果java程序和數據庫不在同一臺機器上,我們一般使用jdbc,如果java程序和數據庫在同一臺機器上,則兩個都可以使用。
數據庫服務器使用的系統不同使用的連接方式也不同,如果是linux或unix服務器,則使用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》