顯示具有 java 標籤的文章。 顯示所有文章
顯示具有 java 標籤的文章。 顯示所有文章

12月 26, 2024

Java 透過 Oracle Wallet 連線資料庫

1. 需要準備 Oracle JDBC Drivers full版 (Wallet會用到oraclepki.jar等套件)

2. 編譯方式
D:\jdk17\bin\javac.exe -cp .;D:\ojdbc17-full\ojdbc17.jar OraDBConn.java
D:\jdk17\bin\java.exe  -cp .;D:\ojdbc17-full\ojdbc17.jar OraDBConn
3. 範例程式碼 (OraDBConn.java)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;

public class OraDBConn {
  public static void main(String[] args) {
    // Database connection information
    String host = "10.18.1.1";
    String port = "1522";
    String serviceName = "SNAME";
    String db_user_id  = "TESTID";
    String db_user_pwd = "2wsx3edc";
    String jdbcUrl = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=" +
                     "(PROTOCOL=TCPS)(HOST=" + host + ")(PORT=" + port + ")))" + 
                     "(CONNECT_DATA=(SERVICE_NAME=" + serviceName + ")))";    
    // Need [cwallet.sso] file for SSO authentication
    System.setProperty("oracle.net.wallet_location", "D:\\wallet");    
    try 
    {
      // Establish a connection using the Oracle Wallet
      Connection connection = 
        DriverManager.getConnection(jdbcUrl, db_user_id, db_user_pwd);     
      System.out.println("Connection established successfully!");
      
      Statement stmt    = connection.createStatement();
      String    sqlcode = "SELECT * FROM OWNER.Table13 WHERE ROWNUM <= 3";
      ResultSet rs      = stmt.executeQuery(sqlcode);           
      while(rs.next())  System.out.println(rs.getString(5) + "\t");
      
      connection.close();
    } 
    catch (SQLException e) { 
      e.printStackTrace(); System.out.println("Failed connect."); }
  }
}

6月 26, 2013

透過 JDBC 連線 Oracle 資料庫

要透過 Java JDBC 連線至 Oracle 資料庫,有幾個要注意的地方:

首先搞清楚連線對象是 "SID" 或 "Service Name" 因為兩者使用語法並不相同,其中:

1. SID (unique name of the INSTANCE)
jdbc:oracle:thin:[USER/PASSWORD]@[HOST][:PORT]:SID
2. Service Name (Alias to an INSTANCE)
jdbc:oracle:thin:[USER/PASSWORD]@//[HOST][:PORT]/SERVICE
實際例子:
Connection conn = null;
conn = DriverManager.getConnection
       ("jdbc:oracle:thin:ID/PASS//HOST_IP:1521/SERVICE_NAME"); 
再來,包裝你想送出的查詢
String StrX = "SELECT * FROM FOO";
sqlMsg = sqlMsg + "WHERE BAR=15";

Statement myQuery = conn.createStatement();
ResultSet Output = myQuery.executeQuery(sqlMsg);

while( Output.next() ) /* 透過迴圈取得資料 */
{
  System.out.println ( 
    Output.getString(1) + "," + Output.getString(2)+ "," +
    Output.getString(3) + "," + Output.getString(4)
  );
}

Output.close();
myQuery.close();
conn.close();
最後必須有一段程式碼,來處理例外狀況 (Java編譯時會偵測)
catch (ClassNotFoundException e) 
{ 
  System.err.println(e.getMessage()); 
}
catch (SQLException e) 
{ 
  System.err.println(e.getMessage()); 
} 
finally 
{ 
  try 
  { 
    if(conn != null) 
      conn.close(); 
  } 
  catch(SQLException e) 
  { 
    System.err.println(e); 
  } 
} 
--

有關 Java 8 中 java.sql.* 函式庫的變革:
The JDBC 4.2 API includes both the java.sql package, referred to as the JDBC core API, and the javax.sql package, referred to as the JDBC Optional Package API. This complete JDBC API is included in the Java Standard Edition (Java SE), version 7.

Since 1.8 -- new in the JDBC 4.2 API and part of the Java SE platform, version 8
Since 1.7 -- new in the JDBC 4.1 API and part of the Java SE platform, version 7

然後最重要的是從 JDBC 4.0 起,不需透過 Class.forName() 預先註冊 Driver
auto java.sql.Driver discovery - no longer need to load a java.sql.Driver class via Class.forName
編譯與執行 (工作目錄 c:\project)
> 編譯 javac foo.java
> 執行 java -cp "c:\project;c:\project\ojdbc8\ojdbc8.jar" foo

2月 24, 2011

使用 '==' 和 String.equals() 的不同

當比較兩個字串(String)時,
使用 '==' 運算子和 java.lang.String.equals()這兩個 method有什麼不同呢?

'=='這個運算子會看看這兩個字串的references是不是指向同一個字串object。而 java.lang.String.equals() 這個method則會比較這兩個字串的"值"是不是一樣的。

換句話說,比較這兩個字串是不是有相同的字元序列。
當使用String literals(一串被雙引號括住的字元)時,使用 '=='運算子和使用equals method 的結果會是一樣的。

所有的String literals都是指向同一個String 類別的 instances。
系統中有一個pool,當有新的String literals出現時,系統會先去檢查 pool 之中,是不是已經存在一個和這個新的String literals有相同內容的物件。

如果存在,則會傳回一個指向這個此物件的reference。
若不存在,則會將此String literals放到 pool中,然後傳回這個物件的reference。

舉個例子:
String s1 = "hello";
String s2 = "hell"+"o";
System.out.println("Using equals op"+ (s1==s2)); //True
System.out.println("Using equals method" + (s1.equals(s2))); //True

當字串是由"new"這個關鍵字所造出來的時候,則不是這麼一回事。

String s3 = new String("hello");
String s4 = new String("hello");
System.out.println("Using equals op" + (s3==s4)); //False
System.out.println("Using equals method" + (s3.equals(s4))); //True

傳用"new"這個關鍵字時,會造出兩個不同的物件,所以會有兩個不同的references,即使在底層的string literal是一樣的。
在上面的例子中,'=='運算子傳回false,因為兩個 references 是不同的。
而equals method則傳回true,因為這兩個物件所代表是同樣的字元序列。

1月 08, 2011

Java Array

  public static void main(String args[])
{
int num[][]= new int[10][]; /* 這個是二維!!不要寫成new int[10] */

for (int idx=0; idx< num.length; idx++)
{
num[idx] = new int[idx]; /* 注意這邊的用法 num[idx] 各別生成 */
}
}

9月 25, 2010

Java 的 UpCasting 與 DownCasting



口訣:
  • UpCasting - 如果你的本質是「子型別」,但把你視為「父型別」來看。
  • DownCasting - 如果本質是「父型別」,但把你視為「子型別」來看。
討論在 Java 中的 UpCasting 與 DownCasting 問題
public class Animal
{
public void run() {}
public void eat() {}
}

public class Fish extends Animal
{
public void swim() {}
}

1. UpCasting 父類別的參考指向子類別物件

Animal ref = new Fish()
記法: UpCasting 就是把「子類別物件」交由「父類別參考」指著 (由下往上提了) 這就是常用的「多型」概念。為何可以這樣做?因為「父類別」能存取的變數、呼叫的函式,在子類別中都有(兒子比老爸強),所以不會出錯
例如:ref.run() 與 ref.eat() 這兩個動作在 Fish 物件中,都是可以辦到的。

2. DownCasting 子類別的參考指向父類別物件,需要強制轉型

Fish ref = (Fish)new Animal()     /* 強制轉型做 DownCasting */
記法: DownCasting 就是把「父類別物件」交由「子類別參考」指著(由上往下降了)經由強制轉型,可以順利編譯完成,但是將來會有機會發生 runtime error 因為: 照理來說 ref 為 Fish 型態,所以支援 ref.swim() 是天經地義。但 ref 骨子裡是 Animal 跟本就沒辦法做到 swim() 這個功能,結果就是 runtime error