2024-03-19  阅读(3)
原文作者:吴声子夜歌 原文地址: https://blog.csdn.net/cold___play/article/details/100850189
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;

202403192031239141.png
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] ,回复【面试题】 即可免费领取。

阅读全文