Java學習篇之--用純Java的JDBC驅動程式實現與資料庫連線
用純Java的JDBC驅動程式實現與資料庫連線
最近在研究JAVA中資料庫的連線,將知識整理一下分享給大家:
Java程式可以用純Java的JDBC驅動程式實現與資料庫連線。這種方法應用較廣泛,但是需要下載相應的驅動程式包,因為不同的資料庫的連線程式碼可能不同,連線不同的資料庫,載入的驅動程式也可能不同。本文將以MySQL資料庫為例來講解連線資料庫的過程。
首先下載驅動程式:
mysql-connector-java-5.0.8-bin.jar
然後新增驅動程式:
選中專案後右鍵選擇Properties->Java Build Path->Add External JARs,選中之前下載的驅動程式
最後可以根據Java中的類和介面進行資料庫的操作連線:
1)、載入驅動程式:
Class.forName("com.mysql.jdbc.Driver");
2)、通過DriverManager類中的getConnection方法獲取資料庫連線:
DriverManager類處理驅動程式的載入和建立新資料庫連線。DriverManager是java.sql包中用於管理資料庫驅動程式的類。通常,應用程式只使用類DriverManager的getConnection()靜態方法,用來建立與資料庫的連線,返回Connection物件。
方法原型:static Connection getConnection(String url,String username,String password)
Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/testdb","root","root");
3)、使用類Connection的物件建立一個Statement物件:
Connection類是java.sql包中用於處理與特定資料庫連線的類。Connection物件是用來表示資料庫連線的物件,Java程式對資料庫的操作都在這種物件上進行。
類Connection主要有以下幾種方法:
方法原型:Statement createStatement() 建立一個Statement物件
Statement createStatement(int resultSetType,int resultSetConcurrency)建立一個Statement物件,生成具有特定型別的結果集
void commit() 提交對資料庫的改動並釋放當前持有的資料庫的鎖
void rollback()
回滾當前事務中的所有改動並釋放當前連線持有的資料庫的鎖
String getCatalog()
獲得連線物件的當前目錄
boolean isClose()
判斷連線是否已關閉
boolean isReadOnly()
判斷連線是否為只讀模式
void setReadOnly()
設定連線為只讀模式
void close() 釋放連線物件的資料庫和JDBC資源
Statement類是java.sql包中用於在指定的連線中處理SQL語句的類。資料庫程式設計的要點是在程式中嵌入SQL命令。程式需要宣告和建立連線資料庫的Connection物件,並讓該物件連線資料庫。呼叫類DriverManager的靜態方法getConnection()獲得Connection物件,實現程式與資料庫的連。然後,用Statement類宣告SQL語句物件,並呼叫Connection物件的createStatement()方法,建立SQL語句物件。
Statement stmt= conn.createStatement();
4)、執行SQL語句:有了SQL語句物件後,呼叫語句物件的方法executeQuery()執行SQL查詢,並將查詢結果存放在一個用ResultSet類宣告的物件中。
ResultSet物件實際上是一個查詢結果資料的表,是一個管式資料集,由統一形式的資料行組成,一行對應一條查詢記錄。在ResultSet物件中隱含著一個遊標,一次只能獲得遊標當前所指的資料行,用next方法可取下一個資料行。用資料行的欄位(列)名稱或位置索引(自1開始)呼叫形如getXXX()方法獲得記錄的欄位植 。
類ResultSet主要有以下幾種方法:
方法原型:
byte getByte(int columnIndex) 返回指定欄位的位元組值
Date getDate(int columnIndex) 返回指定欄位的日期值
float getFloat(int columnIndex) 返回指定欄位的浮點值
int getInt(int columnIndex) 返回指定欄位的整數值
String getString(int columnIndex) 返回指定欄位的字串值
double getDouble(String columnName) 返回指定欄位的雙精度值
long getLong(String columnName) 返回指定欄位的long型整值
boolean next() 返回是否還有下一欄位
以上方法原型中columnIndex是位置索引,用於指定欄位,columnName是欄位名。
使用者需要在查詢結果集上瀏覽,或前後移動、或顯示結果集的指定記錄,這稱為可滾動結果集。程式要獲得一個可滾動結果集,只要在獲得SQL的語句物件時,增加指定結果集的兩個引數即可。
即用函式原型Statement createStatement(int resultSetType,int resultSetConcurrency)。
int 型引數resultSetType決定可滾動集的滾動方式:
ResultSet.TYPE_FORWORD_ONLY 結果集的遊標只能向下滾動
ResultSet.TYPE_SCROLL_INSENSITIVE 遊標可上下移動,當資料庫變化時,當前結果集不變
ResultSet. TYPE_SCROLL_SENSITIVE 遊標可上下移動,當資料庫變化時,當前結果集同步改變
int 型引數resultSetConcurrency決定資料庫是否與可滾動集同步更新:
ResultSet.CONCUR_READ_ONLY 不能用結果集更新資料庫中的表
ResultSet.CONCUR_UPDATETABLE 能用結果集更新資料庫中的表
例如,以下程式碼利用連線物件connect,建立Statement物件stmt,指定結果集可滾動,並以只讀方式讀資料庫:
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
可滾動集上常用的方法如下:
boolean previous() 將遊標向上移動,當移到結果集的第一行時,返回false
void beforeFirst() 將遊標移結果集的第一行之前
void afterLast() 將遊標移到結果集的最後一行之後
void first() 將遊標移到第一行
void last() 將遊標移到最後一行
boolean isAfterLast() 判遊標是否在最後一行之後
boolean isBeforeFirst() 判遊標是否在第一行之前
boolean isLast() 判遊標是否在最後一行
boolean isFirst() 判遊標是否在第一行
int getRow() 獲取當前所指的行(行號自1開始編號,結果集空,返回0)
boolean absolute(int row) 將遊標移到row行
ResultSet rs= stmt.executeQuery("select * "+"from t_test "+"where id='LiMing'");
while(rs.next())
{
System.out.println(rs.getString(2));
}
5)程式設計時常用的一種資料庫操作方法:
利用Statement 的子類PreparedStatement來實現。
String sql = "select * from t_test where lastname=? and firstname=?"
PreparedStatement ptmt=conn.PreparedStatement(sql)
ptmt.setstring(1,"Li")
ptmt.setstring(2,"Ming")
resultSet rs=ptmt.executeQuery()
由於preparedstatement具備很多優點,開發者可能通常都使用它,只有在完全是因為效能原因或者是在一行sql語句中沒有變數的時候才使用通常的statement。
補充:executeQuery、execute、executeUpdate的區別:
executeQuery:
執行select語句返回單個結果集。
execute返回多個結果集:
executeUpdate:
執行資料庫更新語句。
用於執行INSERT、UPDATE或DELETE語句以及SQL DDL(資料定義語言)語句,例如CREATE TABLE 和DROP TABLE。INSERT、UPDATE 或DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個整數,指示受影響的行數(即更新計數)。對於CREATE TABLE 或DROP TABLE 等不操作行的語句,executeUpdate 的返回值總為零。