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();
}
}
}