Java連接Oracle數據庫及封裝JDBC
如果你點開看到了這篇文章,說明你已經或多或少地通過學校學習亦或是自學瞭解了 oracle 數據庫的基本用法。但是實際在開發程序的時候,我們是不可能手動地去操作sql語句的,而是由程序去調用。這個時候,就需要使用上編程語言了。本文主要介紹的是Java連接數據庫的技術 —— JDBC。
文章目錄
一、JDBC???
JDBC的全稱是Java Data Base Connectivity, Java與各大數據庫相連接都是使用這門技術。各種數據庫的API各不相同,Java是如何實現統一的呢?這是因爲sun公司制定了一套標準,各大數據庫廠商依據這個標準開發出數據庫驅動程序。我們只需要使用這些驅動即可操作數據庫。
在oracle安裝目錄之下可以找到這些驅動程序
那麼多個驅動程序,該選擇哪個?
Oracle版本 | jdk版本 | 推薦jar包 | 備註 |
---|---|---|---|
Oracle 8i | JDK 1.1.x | classes111.zip | |
Oracle 8i | JDK 1.1.x | classes12.zip | |
Oracle 9i | JDK 1.1.x | classes111.jar或者 classes111.zip | |
Oracle 9i | JDK 1.2 and JDK 1.3 | classes12.jar 或者 classes12.zip | |
Oracle 9i | JDK 1.4 | ojdbc14.jar | |
Oracle 9i | JDK 1.5 | ojdbc5.jar | |
Oracle 9i | JDK 1.6 | ojdbc6.jar | |
Oracle 10g | JDK 1.2 and JDK 1.3. | classes12.jar | |
Oracle 10g | JDK 1.4 and 5.0 | ojdbc14.jar | |
Oracle 11g | jdk5 | ojdbc5.jar | |
Oracle 11g | jdk6 | ojdbc6.jar |
按照oracle版本和jdk版本選擇,這裏的表格僅作參考。
二、連接!!!
說的太多也沒用,直接上一段程序體驗一下。只需要準備一個IDE(eclipse、IDEA等)和上面所說的驅動程序即可。
創建項目
首先,創建一個普通的Java項目,引入jar包。(我這裏是放在了jbdc_oracle目錄下)最後把鼠標移到ojdbc.jar,右鍵,bulild path,add to build path。
IDEA創建的項目同理(Add to libary),會使用Maven的也可以創建Maven項目,在pom文件引入依賴即可。
編寫代碼
import java.sql.*;
public class Main {
public static void main(String[] args) {
try {
// 1.加載驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
// 2.獲取連接
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
System.out.println(connection.getMetaData());
// 3.創建Statement對象(可以執行sql的對象)
PreparedStatement preparedStatement = connection.prepareStatement("select * from dept");
// 4.獲取結果集
ResultSet resultSet = preparedStatement.executeQuery();
// 5.對數據進行處理
while(resultSet.next()) {
Integer id = resultSet.getInt("DEPTNO");
String dname = resultSet.getString("DNAME");
String location = resultSet.getString("LOC");
System.out.println(id+" "+dname+" "+location);
}
// 6.關閉連接 先調用的最後關閉 關閉前判斷是否存在
if(resultSet != null) {
resultSet.close();
}
if(preparedStatement != null) {
preparedStatement.close();
}
if(connection != null) {
connection.close();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
接下來對以上代碼進行一一說明
-
加載驅動,這裏是固定寫法,包名不要寫錯
Class.forName("oracle.jdbc.driver.OracleDriver");
其實寫法不止這一種,只是比較推薦這種。感興趣的可以看看官方的寫法:
-
獲取連接
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:1521/orcl","scott","tiger");
getConnection()裏面的三個參數分別是url地址,用戶名和密碼
jdbc:oracle:thin:固定寫法,其中thin表示連接數據庫的一種方式,想進一步瞭解的話,文末有參考地址
127.0.0.1:ip地址,這裏表示本機
1521:oracle的端口地址,一般安裝後默認爲1521
orcl:數據庫的實例名稱,一般安裝後默認有一個orcl
JDBC常見的對象
注:以下方法都省略了函數的參數
Connection
意如其名,就是表示數據庫和Java之間的一個連接,所有的數據庫操作都與其密切相關。
prepareStatement();//PreparedStatement對象
createStatement();//Statement對象
commit(); //提交
rollback(); //回滾
prepareCall(); //存儲過程
Statement
executeQuery(); //查詢,返回ResultSet
executeUpdate(); //增加、刪除、更新,返回受影響的行數
/* @return <code>true</code> if the first result is a <code>ResultSet</code>
* object; <code>false</code> if it is an update count or there are
* no results
*/
execute();//增刪改查都可以進行,不建議使用
PreparedStatement
PreparedStatement是Statement的子類,PreparedStatement對象可以對sql語句進行預編譯,並且可以通過佔位符的方式方便我們進行參數的拼接:
PreparedStatement preparedStatement = connection.prepareStatement("select * from dept where deptno=?");
preparedStatement.setInt(1,10); //int對應deptno的類型,1代表第1個問號,
ResultSet
查詢後獲得的結果集
getXXX(數據庫的列名/第幾列) //其中XXX可以是Int,Array,Boolean等
/*
第幾列對應的是sql中的第幾列,
如select deptno,loc,dname from dept;
寫法:getInt(1) / getInt("deptno")
select loc,dname,deptno from dept;
寫法:getInt(3) / getInt("deptno");
這幾個對象多調用幾次就知道如何使用了,總的使用流程是
連接數據庫(獲取Connection對象) -> 創建Statement對象(Statement/PreparedStatement) -> 用Statement對象執行語句(execute/executeUpdate/executeQuery) -> 利用返回值(execute返回true/false,executeUpdate返回受影響行數,executeQuery返回ResultSet)判斷執行的結果 -> 關閉對象
多多使用就對了!
三、封裝
僅供參考,建議先熟悉以上操作後再根據實際情況使用。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
private final static String DRIVER = "oracle.jdbc.driver.OracleDriver";
private final static String URL = "jdbc:oracle:thin:@//127.0.0.1:1521/orcl";
private final static String USERNAME = "scott";
private final static String PWD = "tiger";
public static Connection connection = null;
static Statement stmt = null;
public static PreparedStatement pstmt = null;
private static ResultSet rs;
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//單例模式返回數據庫連接對象
public static Connection getConnection() throws Exception
{
if(connection==null)
{
connection = DriverManager.getConnection(URL, USERNAME,PWD);
return connection;
}
return connection;
}
public static Statement getStatement() throws Exception {
Connection conn = getConnection();
try {
if(conn!=null) {
stmt = conn.createStatement();
}
}catch(Exception e) {
e.printStackTrace();
}
return stmt;
}
//查詢總數
public static int getTotalCount(String sql) { //select count(1) from student
int count = -1 ;
try {
pstmt = createPreParedStatement(sql, null );
rs = pstmt.executeQuery() ;//88
if(rs.next()) {
count = rs.getInt(1) ;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally {
closeAll(rs, pstmt, connection);
}
return count;
}
//通用的增刪改
public static boolean executeUpdate(String sql,Object[] params) {//{"zs",1}
try {
pstmt = createPreParedStatement(sql,params);
int count = pstmt.executeUpdate() ;
if(count>0)
return true ;
else
return false ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false ;
} catch (SQLException e) {
e.printStackTrace();
return false ;
}catch (Exception e) {
e.printStackTrace();
return false ;
}
finally {
closeAll(null,pstmt,connection);
}
}
//Statement
public static void closeAll(ResultSet rs,Statement stmt,Connection connection)
{
try {
if(rs!=null)rs.close();
if(pstmt!=null)pstmt.close();
if(connection!=null)connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static PreparedStatement createPreParedStatement(String sql,Object[] params) throws Exception {
pstmt = getConnection() .prepareStatement(sql) ;
if(params!=null ) {
for(int i=0;i<params.length;i++) {
pstmt.setObject(i+1, params[i]);
}
}
return pstmt;
}
//通用的查:通用表示適合於 任何查詢
public static ResultSet executeQuery(String sql,Object[] params) {
try {
pstmt = createPreParedStatement(sql,params);
rs = pstmt.executeQuery() ;
return rs ;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null ;
} catch (SQLException e) {
e.printStackTrace();
return null ;
}catch (Exception e) {
e.printStackTrace();
return null ;
}
}
}
使用示例
public class Main {
public static void main(String[] args) throws SQLException {
// 查詢示例1
ResultSet rs1 = DBUtil.executeQuery("select * from dept where deptno = ?", new Object[] {10});
if(rs1.next()) {
System.out.println(rs1.getInt(1)+" "+rs1.getString(2)+" "+rs1.getString(3));
}
// 更新示例1
boolean rs2 = DBUtil.executeUpdate("update dept set loc = ? where deptno = ?", new Object[] {"Japan",10});
if(rs2) {
System.out.println("更新成功!");
}
}
}
參考資料: