JDBC連接Oracle


jdbc連接 oracle

依賴

<dependency>
	<groupId>com.oracle.database.jdbc</groupId>
	<artifactId>ojdbc6</artifactId>
	<version>11.2.0.4</version>
</dependency>

Oracle數據庫的 uri

格式一: Oracle JDBC Thin using a ServiceName:

jdbc:oracle:thin:@//<host>:<port>/<service_name> 
Example: jdbc:oracle:thin:@//192.168.2.1:1521/XE
  • 注意這里的格式,@后面有//, 這是與使用SID的主要區別。
  • 這種格式是Oracle 推薦的格式,因為對於集群來說,每個節點的SID 是不一樣的,但是SERVICE_NAME 確可以包含所有節點。

格式二: Oracle JDBC Thin using an SID:

jdbc:oracle:thin:@<host>:<port>:<SID> 
Example: jdbc:oracle:thin:192.168.2.1:1521:X01A 

格式三:jdbc:oracle:thin:@<TNSName>

jdbc:oracle:thin:@(DESCRIPTION_LIST=(LOAD_BALANCE=ON)(FAILOVER=ON)(DESCRIPTION=(CONNECT_TIMEOUT=3)(RETRY_COUNT=2)(ADDRESS_LIST=(LOAD_BALANCE=ON)(FAILOVER=ON)(ADDRESS=(PROTOCOL=TCP)(HOST=10.XXXX)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=10.XXXX)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ompdb_s1))))

JDBCUtils

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @author zhaokuii11@163.com
 * @create 2021-11-22 17:53
 * @Description
 */
public class JDBCUtils {
    private static Connection conn;

   static  {
        try {
            String url = "jdbc:oracle:thin:@//192.168.217.64:1521/orcl";
            String driverClass = "oracle.jdbc.driver.OracleDriver";
            String user = "scott";
            String password = "scott";
            //注冊驅動
            Class.forName(driverClass);
            //獲取連接
            conn = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        return conn;
    }
}

測試

    public static void main(String[] args) throws SQLException {
        //獲取連接對象
        Connection connect = JDBCUtils.getConnection();
        //准備 sql模板
        String sql = "select * from tab_student where s_id=?";
        //獲取預編譯對象
        PreparedStatement ps = connect.prepareStatement(sql);
        //給占位符賦值
        ps.setInt(1, 1);
        //執行 execute方法 獲取結果集
        ResultSet rs = ps.executeQuery();
        //處理結果集
        while (rs.next()) {
            int id = rs.getInt(1);
            String name = rs.getString(2);
            int age = rs.getInt(3);
            Date birthday = rs.getDate(4);
            String address = rs.getString(5);
            System.out.println("id:" + id + " name:" + name
                    + " age:" + age + " birthday:"
                    + birthday + " address:" + address);

        }
        //關閉連接
        rs.close();
        ps.close();
        connect.close();
    }
//控制台
id:1 name:aa age21 birthday:2021-11-15 address:河南

通過 jdbc調用存儲過程/函數

  • 調用存儲過程使用的是 PreparedStatement的子接口 CallableStatement

存儲過程

  • 格式
    {?= call <procedure-name>[(<arg1>,<arg2>, ...)]}  --調用function
    

函數

  • 格式
    {call <procedure-name>[(<arg1>,<arg2>, ...)]}     --調用procedure
    

代碼

package com.zhiyou100;

import java.sql.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @author zhaokuii11@163.com
 * @create 2021-11-19 20:11
 * @Description
 */
public class TestJDBC {
    private Connection conn = null;
    private CallableStatement call = null;

    @Before//獲取
    public void init() {
        conn = JDBCUtils.getConnection();
    }


    /**
     * 存儲過程
     * 	create or replace procedure
     * 	   pro_1(a in int,b out int, c in out int)
     * 	as
     * 	begin
     * 	  b:=a+1;
     * 	  c:=c+a;
     * 	end;
     * @throws Exception
     */
    @Test
    public void procedure() throws Exception {
        //獲取 CallableStatement
        //sql模板:{call <procedure-name>[(<arg1>,<arg2>, ...)]}
        call = conn.prepareCall("{call pro_1(?,?,?)}");
        //給占位符賦值
        //給第一個參數 in 模式的參數賦值
        call.setInt(1,5);
        //給第二個參數 out 模式的參數 指定第二個 out參數的類型
        call.registerOutParameter(2, Types.INTEGER);
        //給第三個參數 in out 模式的參數
        call.setInt(3,6);//給第三個參數賦值
        call.registerOutParameter(3, Types.INTEGER);//指定為out模式
        //執行存儲過程
        System.out.println(call.execute());//false
        //處理結果集
        System.out.println("b = "+call.getInt(2));//6
        System.out.println("c = "+call.getInt(3));//11
    }

    /**
     * 存儲函數
     * 	create or replace function
     * 	   fun_1(a int,b float)
     * 	return float
     * 	as
     * 	begin
     * 	   return a+b;
     * 	end;
     * 	第一種:
     * 	@throws SQLException
     */
    @Test
    public void function() throws SQLException {
        //獲取callablestattement
        //sql模板:{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}  調用function
        call=conn.prepareCall("{?= call fun_1(?,?)}");
        //給占位符賦值:function的返回值就是 procedure的out模式的參數,function的參數就是 procedure的in模式的參數
        call.registerOutParameter(1, Types.FLOAT);
        call.setInt(2,5);
        call.setInt(3,6);
        //執行函數
        System.out.println(call.execute());//false
        //處理結果集
        System.out.println("float = "+call.getFloat(1));//11.0
    }

    /**
     * 第二種:
     * 使用 prepareStatement 執行 存儲函數
     * @throws SQLException
     */
    @Test
    public void StatementFunction()throws SQLException{
        //獲取callablestattement
        //sql模板:{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}  調用function
        PreparedStatement ps=conn.prepareStatement("select fun_1(?,?) fn from dual");
        ps.setInt(1,5);
        ps.setInt(2,6);
        ResultSet set=ps.executeQuery();
        if(set.next()){
            //給 fun_1 函數起了一個別名
            System.out.println("fn = "+set.getFloat("fn"));//11
        }
        ps.close();
    }


    @After//關閉連接
    public void destroy() {
        if (conn!=null)
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        if (call!=null)
            try {
                call.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM