初始配置:電腦安裝oracle 11g(這里也可使是其它版本也可,此教程演示為11g),java環境,eclipse,oracle關於jdbc的jar包。
一,在scott用戶下首先要有存儲過程和存儲方法
create or replace queryEmpIncome(eno in number) return number as psal emp.sal%type; pcomm emp.comm%type; begin select sal,comm into pasl,pcomm from emp where empno = eno; return psal*12 + nvl(pcomm,0); end;
create or replace procedure queryEmpInformation(eno in number, pename out varchar2,psal out number,pjob out varchar2) as begin select ename,sal,job into pename,psal,pjob from emp where empno = eno; end;
二.創建數據庫連接工具類
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:1521:orcl"; private static String user = "scott"; private static String password = "tiger"; 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; } } } }
三.寫測試類
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import oracle.jdbc.OracleCallableStatement; import oracle.jdbc.OracleTypes; import org.junit.Test; import cn.ht.utils.JDBCUtils; public class TestOracle { /* * create or replace procedure queryEmpInformation(eno in number, pename out varchar2, psal out number, pjob out varchar2) */ @Test public void testProcedure(){ //{call <procedure-name>[(<arg1>,<arg2>, ...)]} String sql = "{call queryEmpInformation(?,?,?,?)}"; Connection conn = null; CallableStatement call = null; try { conn = JDBCUtils.getConnection(); call = conn.prepareCall(sql); //對於in參數,賦值 call.setInt(1,7839); //對於out參數,申明 call.registerOutParameter(2, OracleTypes.VARCHAR); call.registerOutParameter(3, OracleTypes.NUMBER); call.registerOutParameter(4, OracleTypes.VARCHAR); //執行 call.execute(); //輸出 String name = call.getString(2); double sal = call.getDouble(3); String job = call.getString(4); System.out.println(name+"\t"+sal+"\t"+job); } catch (Exception e) { e.printStackTrace(); }finally{ JDBCUtils.release(conn, call, null); } } /* * create or replace function queryEmpIncome(eno in number) return number */ @Test public void testFunction(){ //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} String sql = "{?=call queryEmpIncome(?)}"; Connection conn = null; CallableStatement call = null; try { conn = JDBCUtils.getConnection(); call = conn.prepareCall(sql); call.registerOutParameter(1, OracleTypes.NUMBER); call.setInt(2, 7839); //執行 call.execute(); //取出年收入 double income = call.getDouble(1); System.out.println(income); } catch (Exception e) { e.printStackTrace(); }finally{ JDBCUtils.release(conn, call, null); } } }
總結:以jdbc的方式實現了java查詢數據庫。並且調用了oracle的存儲方法和過程。