oracle02_jdbc

1:通过jdbc连接oracle

找到oracle的驱动

image-20221222100430389

url

thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracle客户端,只要求classpath中包含jdbc驱动的jar包就行。thin就是纯粹用Java写的ORACLE数据库访问接口。  
       适用于单机连接
oci是一种胖客户端的连接方式,即采用这种连接方式需要安装oracle客户端。oci是Oracle Call Interface的首字母缩写,是ORACLE公司提供了访问接口,就是使用Java来调用本机的Oracle客户端,然后再访问数据库,优点是速度 快,但是需要安装和配置数据库。   
       适用于集群连接

铁打步骤

package com.zhiyou100.demo10_oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Demo01Jdbc {
    private static String driverName,userName,userPwd,url;
    static{
    	driverName="oracle.jdbc.driver.OracleDriver";
    	userName="miao";
    	userPwd="123";
    	url="jdbc:oracle:thin:@localhost:1521:orcl43";
    }
    static{
    	try {
			Class.forName(driverName);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
    }
	public static void main(String[] args) {
		  System.out.println(getCon());

	}
	public static Connection getCon(){
		try {
			return DriverManager.getConnection(url, userName, userPwd);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	public static void close(Statement sta,ResultSet set,Connection con){
		try {
			if(set!=null) set.close();
			if(sta!=null) sta.close();
			if(con!=null) con.close();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

2 : 通过jdbc对存储过程调用

定义存储过程

-- 定义存储过程
create or replace procedure
   pro_1(a in int,  b out int,c in int,  d out int)
as
begin
  b:=a*a;
  d:=a*c;
end;

create or replace procedure
   pro_2(a in int, b in int, c in out int, d out int)
as
begin
  c:=c+a+b;
  d:=c*c;
end;

调用存储过程

private static void test02() throws SQLException {
    //操作存储过程:pro_2(a in int, b in int, c in out int, d out int)
    Connection con=Demo01Jdbc.getCon();
    //调用存储过程 使用接口CallableStatement
    //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
    //{call <procedure-name>[(<arg1>,<arg2>, ...)]}
    String sql="{call pro_2(?,?,?,?)}";
    CallableStatement call=con.prepareCall(sql);
    //给占位符赋值
    call.setInt(1, 4);  //给in模式的参数赋值
    call.setInt(2, 5);  //给in模式的参数赋值
    call.setInt(3, 6);  //给in模式的参数赋值
    call.registerOutParameter(3, java.sql.Types.INTEGER);//指定out模式的参数
    call.registerOutParameter(4, java.sql.Types.INTEGER);//指定out模式的参数
    //执行
    call.execute();
    //接受out模式的参数的值
    int result1=call.getInt(3);//参数是占位符
    int result2=call.getInt(4);//参数是占位符
    System.out.println(result1+"::::"+result2);
    Demo01Jdbc.close(call, null, con);
}

private static void test01() throws SQLException {
    //操作存储过程:pro_1(a in int,  b out int,c in int,  d out int)
    Connection con=Demo01Jdbc.getCon();
    //调用存储过程 使用接口CallableStatement
    //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
    //{call <procedure-name>[(<arg1>,<arg2>, ...)]}
    String sql="{call pro_1(?,?,?,?)}";
    CallableStatement call=con.prepareCall(sql);
    //给占位符赋值
    call.setInt(1, 4);  //给in模式的参数赋值
    call.setInt(3, 6);  //给in模式的参数赋值
    call.registerOutParameter(2, java.sql.Types.INTEGER);//指定out模式的参数
    call.registerOutParameter(4, java.sql.Types.INTEGER);//指定out模式的参数
    //执行
    call.execute();
    //接受out模式的参数的值
    int result1=call.getInt(2);//参数是占位符
    int result2=call.getInt(4);//参数是占位符
    System.out.println(result1+"::::"+result2);
    Demo01Jdbc.close(call, null, con);
}

3 : 通过jdbc对函数调用

定义方法

-- 定义函数
create or replace function
  fun_1(a int,b float)
  return float
as
begin
  return a+b;
end;

调用方法

//方式1:通过CallableStatement调用方法
private static void test011() throws SQLException {
    //操作方法:fun_1(a int,b float) return float
    Connection con=Demo01Jdbc.getCon();
    //调用存储过程 使用接口CallableStatement
    //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
    //{call <procedure-name>[(<arg1>,<arg2>, ...)]}
    String sql="{?= call fun_1(?,?)}";
    CallableStatement call=con.prepareCall(sql);
    //给占位符赋值
    call.setInt(2, 4);  //给参数赋值
    call.setFloat(3, 1.5f);  //给参数赋值
    call.registerOutParameter(1, java.sql.Types.FLOAT);//指定返回值
    //执行
    call.execute();
    //接受out模式的参数的值
    float result1=call.getFloat(1);//接受返回值
    System.out.println(result1);
    Demo01Jdbc.close(call, null, con);
}

//方式2:通过select调用方法:注意此时的方法不能有sql不支持的类型
private static void test02() throws SQLException {
    //操作方法:fun_1(a int,b float) return float
    Connection con=Demo01Jdbc.getCon();
    //调用存储过程 使用接口CallableStatement
    String sql="select fun_1(?,?) result from dual";
    CallableStatement call=con.prepareCall(sql);
    //给占位符赋值
    call.setInt(1, 4);  //给参数赋值
    call.setFloat(2, 1.5f);  //给参数赋值
    //执行
    ResultSet set=call.executeQuery();
    if(set.next()){
        System.out.println("结果是:"+set.getFloat("result"));
    }
    Demo01Jdbc.close(call, set, con);
}

注意事项

方法的参数和返回值 尽量不要使用boolean 否则execute会报错!调用 'FUN_2' 时参数个数或类型错误
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值