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();
}
}
什麼時候使用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》