jdbc连接oracle
获取jar
oracle的驱动jar在mvn*仓库 是没有
在oracle的软件中就有此jar
E:\Java\software\oracle\product\11.2.0\dbhome_1\jdbc\lib
创建项目 导入jar
创建连接
thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracle客户端,
只要求classpath中包含jdbc驱动的jar包就行。
thin就是纯粹用Java写的ORACLE数据库访问接口。适用于单机连接
oci是一种胖客户端的连接方式,即采用这种连接方式需要安装oracle客户端。
oci是Oracle Call Interface的首字母缩写,是ORACLE公司提供了访问接口,
就是使用Java来调用本机的Oracle客户端,然后再访问数据库,优点是速度快,
但是需要安装和配置数据库。适用于集群连接
package wen.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Test_Jdbc {
public static void main(String[] args) throws Exception {
// 1 导入jar
// 2 注册驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 3 准备参数
String url = "jdbc:oracle:thin:@localhost:1521:orcl", user = "wen", pwd = "123";
// 4 获取连接
Connection con = DriverManager.getConnection(url, user, pwd);
// 5 准备sql模板
String sql = "select * from student where sex=?";
// 6 获取预编译对象
PreparedStatement pre = con.prepareStatement(sql);
// 7 给占位符赋值
pre.setString(1, "女");
// 8 执行execute方法 获取结果集
ResultSet set = pre.executeQuery();
// 9 处理结果集
while (set.next()) {
int sid = set.getInt("sid");
String sname = set.getString("sname");
String sex = set.getString("sex");
int sage = set.getInt("sage");
float score = set.getFloat("score");
System.out.println(sid + ":" + sex + ":" + sname + ":" + sage + ":" + score);
}
// 10 关闭连接释放资源
set.close();
pre.close();
con.close();
}
}
通过jdbc调用存储过程
格式
调用存储过程使用是preparedstatement的子接口CallableStatement
格式:
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} 调用function
{call <procedure-name>[(<arg1>,<arg2>, ...)]} 调用procedure
创建连接和关闭连接
private static Connection getCon() {
try {
// 1 导入jar
// 2 注册驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// 3 准备参数
String url = "jdbc:oracle:thin:@localhost:1521:orcl", user = "wen", pwd = "123";
// 4 获取连接
Connection con = DriverManager.getConnection(url, user, pwd);
return con;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void close(Connection con, Statement sta, ResultSet set) {
try {
if (set != null)
set.close();
if (sta != null)
sta.close();
if (con != null)
con.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
创建存储过程
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;
jdbc调用
private static void executeProcedure() throws Exception {
// 获取连接
Connection con = getCon();
// 获取sql模板:{call <procedure-name>[(<arg1>,<arg2>, ...)]}
CallableStatement call = con.prepareCall("{call pro_1(?,?,?)}");
// 给第一个参数in模式的参数赋值
call.setInt(1, 5);
// 给第二个参数out模式的参数 指定第二个out参数的类型
call.registerOutParameter(2, Types.INTEGER);
// 给第三个参数in out模式的参数
call.setInt(3, 6);
// 指定为out模式
call.registerOutParameter(3, Types.INTEGER);
// 执行存储过程
boolean b = call.execute();
// 处理结果集
int bresult = call.getInt(2);
int cresult = call.getInt(3);
System.out.println("b=" + b + "," + bresult + "," + cresult);
// 关闭连接
close(con, call, null);
}
通过jdbc调用函数
创建函数
create or replace function
fun_1(a int,b float)
return float
as
begin
return a+b;
end;
调用1
private static void executeFunction1() throws Exception {
// 获取连接
Connection con = getCon();
// 获取sql模板:{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
CallableStatement call = con.prepareCall("{?=call fun_1(?,?)}");
// 给占位符赋值
call.registerOutParameter(1, Types.FLOAT);
call.setInt(2, 5);
call.setFloat(3, 6);
// 执行函数
boolean b = call.execute();
// 处理结果集
float cresult = call.getFloat(1);
System.out.println("b=" + b + "," + cresult);
// 关闭连接
close(con, call, null);
}
调用2
private static void executeFunction2() throws Exception {
// 获取连接
Connection con = getCon();
// 获取sql模板
PreparedStatement pre = con.prepareStatement("select fun_1(?,?) fn from dual");
// 给占位符赋值
pre.setInt(1, 5);
pre.setFloat(2, 1.1f);
// 执行execute方法
ResultSet set = pre.executeQuery();
// 获取结果集
if (set.next()) {
System.out.println("fn=" + set.getFloat("fn"));
}
// 关闭连接
close(con, pre, set);
}