1. 创建工程并导入Oracle的驱动jar包
创建一个JDBCUtils工具类
package pers.zhang.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
private static String driver = "oracle.jdbc.OracleDriver";
private static String url = "jdbc:oracle:thin:localhost/orcl";
private static String user = "scott";
private static String password = "123456";
static{
//注册驱动
//DriverManager.registerDriver(driver)
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection(){
try {
return DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/*
* 运行Java:
* java -Xms100M -Xmx200M HelloWorld
*
* 技术方向:
* 1、性能优化
* 2、故障诊断:死锁(JDK: ThreadDump)
* Oracle: 自动处理
*/
public static void release(Connection conn,Statement st,ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null; ///-----> 原因:Java GC: Java的GC不受代码的控制
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
}
实现过程的调用
1. 过程定义:
--统计年薪的过程
create or replace procedure proc_countyearsal(eno in number, esal out number)
as
begin
select sal * 12 + nvl(comm, 0) into esal from emp where empno = eno;
end;
--调用
declare
esal number;
begin
proc_countyearsal(7839,esal);
dbms_output.put_line(esal);
end;
过程调用:
@Test
public void testProcedure01() {
Connection conn = null;
CallableStatement callSt = null;
try {
conn = JDBCUtils.getConnection();
callSt = conn.prepareCall("{call proc_countyearsal(?,?)}");
//对于in参数赋值
callSt.setInt(1, 7839);
//对于out参数声明
callSt.registerOutParameter(2, OracleTypes.NUMBER);
callSt.execute();
System.out.println(callSt.getObject(2));
}catch(Exception e) {
e.printStackTrace();
}
}
运行JUnit测试输出:
60000
游标引用的Java测试
1. 定义过程,并返回引用型游标
--定义过程
create or replace procedure proc_cursor_ref (dno in number, empList out sys_refcursor)
as
begin
open empList for select * from emp where deptno = dno;
end;
--在pl/sql中调用
declare
mycursor_c sys_refcursor;
myempc emp%rowtype;
begin
proc_cursor_ref(20,mycursor_c);
loop
fetch mycursor_c into myempc;
exit when mycursor_c%notfound;
dbms_output.put_line(myempc.empno || ',' || myempc.ename);
end loop;
close mycursor_c;
end;
java代码调用游标类型的out参数:
@Test
public void testFunction01() {
Connection conn = null;
CallableStatement callSt = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
callSt = conn.prepareCall("{call proc_cursor_ref(?,?)}");
callSt.setInt(1, 20);
callSt.registerOutParameter(2, OracleTypes.CURSOR);
callSt.execute();
rs = ((OracleCallableStatement)callSt).getCursor(2);
while(rs.next()) {
System.out.println(rs.getObject(1) + "," + rs.getObject(2));
}
}catch(Exception e) {
e.printStackTrace();
}
}
运行JUnit测试输出:
7369,SMITH
7566,JONES
7788,SCOTT
7876,ADAMS
7902,FORD
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。