JDBC連接oracle數據庫 ,Statement, PreparedStatement,CallableStatement 的使用,對時間參數的處理

JDBC連接oracle
1.在Oracle數據庫安裝文件夾中找到 jdbc文件夾→lib文件夾 E:\app\amin\product\11.2.0\dbhome_1\jdbc\lib
2.在myeclipse中導入此Jar包
    導入方法:
           建立一個項目,在項目名稱上右鍵鼠標選擇
           Build Path→ConfigBuildPath->libaraies→Add jars或add Externaljars
           用 ojdbcX.jar進行導入

3.新建一程序編寫與Oracle連接的代碼
    步驟如下:
 1).實例化驅動類
          class.forName("oracle.jdbc.OracleDriver");//
          
 2).建立到數據庫的連接
          String url="jdbc:oracle:thin:@localhost:ORCL";
          Connection conn = DriverManager.getConnection(url,"scott","tiger");
          如果提示無法連接,請檢查: 
          ip地址,oracle的數據庫名稱是否對,用戶名密碼
Statement 用於處理sql語句:
(注意: Connection,Resultset,Statement,
        PreparedStatement,CallableStatement都是java.sql包中的
 3).將創建語句對象,發送sql到數據庫中
          Statement stm = conn.createStatement();

 4).執行語句(select語句),得於結果集
          ResultSet rs = stm.executeQuery("select * from dept");

 5).從結果集取數據
            while(rs!=null&& rs.next){//rs爲空的情況爲sql語句錯誤
              rs.getString("deptno");
              rs.getString("deptno");
          }
  //問題2 DML
	        String sql2="update emp set sal=sal+1 where empno="+7788;
	        int intNum=stm.executeUpdate(sql2);
	        System.out.println("intNum="+intNum);
	        
//問題3 日期的處理
	        //查hiredate大於1982-01-01 的所有員工
	        System.out.println("------------");
	        String d="1982-01-01";
	        //to_date('1982-01-01','yyyy-mm-dd')
	     String sql3="select * from emp where hiredate>to_date('"+d+"','yyyy-mm-dd')";
	        rs=stm.executeQuery(sql3);
	        while(rs!=null&& rs.next()){  //rs.next()下一行有沒有數據
	        	int empno=rs.getInt("empno");
	        	String name=rs.getString("ename");
	        	System.out.println(empno+" "+name );
	        }

PreparedStatement 用於處理預編譯語句
/**
 * 
 * preparedStatement 是statement的子類
 * 作用:
 * 1. 簡化編程,減少sql拼接
 * 2. 防止sql注入
 * 3. 預編譯,提高效率!
 *
 注意:通過PreparedStatement防止SQL注入,對JDBC而言,SQL注入攻擊只對Statement有效,對PreparedStatement無效
public static void main(String[] args) {	
		 Connection conn=null;
		 Statement stm=null;
		 ResultSet rs=null;
		try {
			//1).實例化驅動類
			Class.forName("oracle.jdbc.OracleDriver");//反射
			// 2).建立到數據庫的連接
			//String url="jdbc:oracle:thin:@192.168.0.1:1521:ORCL";
	        String url="jdbc:oracle:thin:@localhost:1521:ORCL";
	        conn = DriverManager.getConnection(url,"scott","tiger");
	        //3).將創建語句對象,發送sql到數據庫中
	        stm = conn.createStatement();
	        String sql="select * from emp";
	        rs=stm.executeQuery(sql);
	        //4)取結果 
	        System.out.println("rs="+rs);
	        while(rs!=null&& rs.next()){  //rs.next()下一行有沒有數據
	        	int empno=rs.getInt("empno");
	        	String name=rs.getString("ename");
	        	System.out.println(empno+" "+name );
	        }
	        
	        //問題2 DML
	        String sql2="update emp set sal=sal+1 where empno="+7788;
	        int intNum=stm.executeUpdate(sql2);
	        System.out.println("intNum="+intNum);
	        
	        //問題3 日期的處理
	        //查hiredate大於1982-01-01 的所有員工
	        System.out.println("------------");
	        String d="1982-01-01";
	        //to_date('1982-01-01','yyyy-mm-dd')
	        String sql3="select * from emp where hiredate>to_date('"+d+"','yyyy-mm-dd')";
	        rs=stm.executeQuery(sql3);
	        while(rs!=null&& rs.next()){  //rs.next()下一行有沒有數據
	        	int empno=rs.getInt("empno");
	        	String name=rs.getString("ename");
	        	System.out.println(empno+" "+name );
	        }
	        
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
	        try {
	        	if(rs!=null){
				  rs.close();
	        	}
			} catch (SQLException e) {
				e.printStackTrace();
			}
	        try {
	        	if(stm!=null){
				   stm.close();
	        	}
			} catch (SQLException e) {
				e.printStackTrace();
			}
	        try {
	        	if(conn!=null){
				   conn.close();
	        	}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

 CallableStatement 用於調用存儲過程

import java.sql.*;
/**
 * CallableStatement 是PreparedStatement的子類
 * 語法:
 * String sql="{call myproc3(?,?,?)}";
 *
 */
public class JDBCTestCall {

	public static void main(String[] args) {	
		 Connection conn=null;
		 Statement stm=null;
		 ResultSet rs=null;
		try {
			//1).實例化驅動類
			Class.forName("oracle.jdbc.OracleDriver");//反射
			// 2).建立到數據庫的連接
			//String url="jdbc:oracle:thin:@192.168.0.1:1521:ORCL";
	        String url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
	        conn = DriverManager.getConnection(url,"scott","tiger");
	        
	        //演示1 call myproc3 有1個in 2個out
	        String sql="{call myproc3(?,?,?)}";
	        //問題1 進行查詢拼接
	        CallableStatement call= conn.prepareCall(sql);
	        //處理參數
	        call.setInt(1, 10);//第1個問號  in
	        call.registerOutParameter(2, Types.DOUBLE);
	        call.registerOutParameter(3, Types.DOUBLE);
	        call.execute();
	        //取out結果
	        double totalSal= call.getDouble(2);
	        double avgSal=call.getDouble(3);
	        System.out.println("total="+totalSal+" avgSal="+avgSal);
	        
	        //演示2 
	        String sql2="{call showEmpInfo(?,?,?,?,?)}";
	        call= conn.prepareCall(sql2);
	        //處理參數
	        call.setDouble(1, 1000);//第1個問號  in
	        call.setDouble(2, 3000);
	        call.registerOutParameter(3, Types.DOUBLE);
	        call.registerOutParameter(4, Types.DOUBLE);
	        call.registerOutParameter(5, oracle.jdbc.OracleTypes.CURSOR);//
	        call.execute();
	        //取out結果
	        double cnt= call.getDouble(3);
	        double ss=call.getDouble(4);
	        ResultSet rs1=(ResultSet)call.getObject(5);//結果集??
	        
	        System.out.println("cnt="+cnt+" ss="+ss);
	        while(rs1!=null&& rs1.next()){  //rs.next()下一行有沒有數據
	        	int empno=rs1.getInt("empno");
	        	String name=rs1.getString("ename");
	        	System.out.println(empno+" "+name );
	        }	 
	        	
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			//close();
		}

	}

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章