2021年7月28日 星期三

透過 ojdbc6 連 oracle,並進行基本操作

建立一個 maven 的專案,設定 pom.xml 的 dependency,利用 maven 下載 ojdbc6 的函式庫,並透過 ojdbc6 連入 oracle 完成 INSERT/UPDATE/SELECT/DELETE 基本操作


環境

    Intellij IDEA 2021.1
    Oracle 19c
    Oracle 資料庫中已建立資料表    
    CREATE TABLE "PERSON" ("NAME" VARCHAR2(100), "EMAIL" VARCHAR2(100), "AGE" NUMBER(*,0))

本文


1. IDEA 建立一個 project,其結構如下

程式入口的 main 方法在 app.java 中

 


2. 上 MVNRepository 查詢 ojdbc6 的 dependency

選這個版本單純是因為我看他 Last Release 的時間比較近而己



 

pom.xml 中加入

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.4</version>
    </dependency>
</dependencies>

3. 專案上按右鍵,選 「Maven -> Reload project」


4. 在 App.java 寫入程式碼

比較重要的是,一定要有 Commit 這個動作,不然造成資料 lock 的問題,比方說,第一段程式會 INSERT 資料到 Oracle,但如果 INSERT 沒有 Commit,就會導致第二段的 Update 程式在「stUpdate.executeUpdate(sqlUpdate);」時卡住,因為資料還處於 lock 的狀態。

package basic;

        import java.sql.*;

        public class App {
            public static void main(String[] args) throws SQLException {
                String url = "jdbc:oracle:thin:@192.168.1.113:1521/ORCLPDB1";
                String uid = "yu";
                String pw = "qwe";

                // 初始化驅動
                // Class.forName("oracle.jdbc.driver.OracleDriver");
                // 根據連線字串、uid、pw,生成連線物件
                Connection conn = DriverManager.getConnection(url, uid, pw);
                System.out.println(conn.isClosed());

                if(conn == null){
                    System.out.println("fail");
                } else {
                    System.out.println("succ");
                }

                conn.close();

                // 看起來連線關閉後重新打開的方式是再重新 DriverManager.getConnection(url, uid, pw); 拿一次連線的樣子
                // conn.close();
                // Connection conn = DriverManager.getConnection(url, uid, pw);

                // 生成連線物件
                conn = DriverManager.getConnection(url, uid, pw);
                String sqlInsert = "INSERT INTO person (name, email, age) values ('nameA', 'email1', 999) ";
                // 生成輔助執行 SQL 指令的物件,應該是類似 .net 的 SQLCommand 的東西
                Statement stInsert  = conn.createStatement();
                // 執行 sql 指令並回傳新增資料的筆數
                int countInsert = stInsert.executeUpdate(sqlInsert);
                // commit 的動作 (非常重要,漏掉會導致資料 lock 的問題)
                conn.commit();
                System.out.println("插入 " + countInsert + " 筆資料");
                // 關閉物件 (關閉後 conn 還是開著的)
                stInsert.close();
                // 關閉 conn
                conn.close();

                conn = DriverManager.getConnection(url, uid, pw);
                String sqlUpdate = "UPDATE person SET email = 'nameA@gmail.com', age = 9 where name='nameA'";
                Statement stUpdate = conn.createStatement();
                int countUpdate = stUpdate.executeUpdate(sqlUpdate);
                conn.commit();
                System.out.println("修改 " + countUpdate + " 筆資料");
                stUpdate.close();
                conn.close();

                conn = DriverManager.getConnection(url, uid, pw);
                String sqlSelect = "SELECT * FROM person";
                Statement stSelect = conn.createStatement();
                ResultSet rs = stSelect.executeQuery(sqlSelect);
                while(rs.next()){
                    String name = rs.getString("name");
                    String email = rs.getString("email");
                    int age = rs.getInt("age");
                    System.out.println(name + " " + email + " " + age);
                }
                stSelect.close();
                conn.close();

                conn = DriverManager.getConnection(url, uid, pw);
                String sqlDelete = "DELETE FROM person";
                Statement stDelete = conn.createStatement();
                int countDelete = stDelete.executeUpdate(sqlDelete);
                conn.commit();
                System.out.println("刪除:" + countDelete + "筆");
                stDelete.close();
                conn.close();

                System.out.println("hello world");
            }
        }

沒有留言:

張貼留言