oracle的驱动jar在mvn中央仓库 是没有
在oracle的软件中就有此jar
E:\Java\software\oracle\product\11.2.0\dbhome_1\jdbc\lib
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(); } }
调用存储过程使用是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;
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); }
create or replace function fun_1(a int,b float) return float as begin return a+b; end;
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); }
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); }