1what
JDBC(Java Data Base Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序,同時,JDBC也是個商標名。
2why
JDBC 可做三件事:與數據庫建立連接、發送 操作數據庫的語句並處理結果。
3how
簡單的例子
package db;
import java.sql.*;
import com.sun.corba.se.spi.orbutil.fsm.Guard.Result;
class Jdbc2 {
public static void main(String[] args) throws Exception {
//1.先new 一個driver 然後向managerDriver註冊
Class.forName("com.mysql.jdbc.Driver");
//2.通過DriverManager.getConnection傳遞個方法,嚴格的說是jdbc的url
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "1234");
//3.創建個statement對象,執行sql語句
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from test.admin");
//4.取得結果集 5.對其進行便利
while (rs.next()) {
System.out.println(rs.getString("username"));
System.out.println(rs.getInt("id"));
}
//6.關閉(要遵循後執行的先閉,先執行的後閉的原則)
rs.close();
stmt.close();
conn.close();
}
}
/**
* 此例子需要注意的是:
* 1.驅動是否在lib文件夾下面。
* 2.數據庫裏面的庫名以及表是否存在
* 3."jdbc:mysql://localhost:3306/test", "root", "1234");
* 分別對應的是地址、端口、庫名、數據庫的管理員名字、管理員密碼。
* 4."select * from test.admin" sql語句建議一定寫的時候用 庫名.表名。
*/
/*
詳解的例子
1 註冊一個driver
註冊驅動程序有三種方式:
ojdbc14.jar
方式一:Class.forName(“oracle.jdbc.driver.OracleDriver”);
JAVA規範中明確規定:所有的驅動程序必須在靜態初始化代碼塊中將驅動註冊到驅動程序管理器中。
方式二:Driver drv = new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver(drv);
方式三:編譯時在虛擬機中加載驅動
javac –Djdbc.drivers = oracle.jdbc.driver.OracleDriver xxx.java
java –D jdbc.drivers=驅動全名類名
使用系統屬性名,加載驅動 -D表示爲系統屬性賦值
附 : mysql的Driver的全名com.mysql.jdbc.Driver
SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver
2建立連接
conn=DriverManager.getConnection(“jdbc:oracle:thin:@192.168.0.20:1521:tarena”, ” User”,” Pasword”);
Oracle子協議
Connection連接是通過DriverManager的靜態方法getConnection(.....)來得到的,這個方法的實質是把
參數傳到實際的Driver中的connect()方法中來獲得數據庫連接的。
Oracle URL的格式:
jdbc:oracle:thin:(協議)@XXX.XXX.X.XXX:XXXX(IP地址及端口號):XXXXXXX(所使用的庫名)
MySql URL的寫法 例: jdbc:mysql://192.168.8.21:3306/test
3 獲得一個Statement對象
sta = conn.createStatement();
4 通過Statement執行Sql語句
sta.executeQuery(String sql);返回一個查詢結果集。
sta.executeUpdate(String sql);返回值爲int型,表示影響記錄的條數。
將sql語句通過連接發送到數據庫中執行,以實現對數據庫的操作。
5 處理結果集
使用Connection對象獲得一個Statement,Statement中的executeQuery(String sql) 方法可以
使用select語句查詢,並且返回一個結果集 ResultSet通過遍歷這個結果集,可以獲得select語句的查尋
結果,ResultSet的next()方法會操作一個遊標從第一條記錄的前面開始讀取,直到最後一條記錄。
executeUpdate(String sql) 方法用於執行DDL和DML語句,比如可以update,delete操作。
只有執行select語句纔有結果集返回。
例:
Statement str=con.createStatement(); //創建Statement
String sql=”insert into test(id,name) values(1,”+”’”+”test”+”’”+”)”;
str. executeUpdate(sql); //執行Sql語句
String sql=”select * from test”;
ResultSet rs=str. executeQuery(String sql);//執行Sql語句,執行select語句後有結果集
while(rs.next()){ //遍歷處理結果集信息
System.out.println(rs.getInt(“id”));
System.out.println(rs.getString(“name”))
//next()如果有下一條記錄返回true,否則爲false;有,則遊標向下一條記錄.
}
6 關閉數據庫連接(釋放資源) 調用.close()
rs.close();
sta.close();
con.close();
ResultSet Statement Connection是依次依賴的。
注意:要按先ResultSet結果集,後Statement,最後Connection的順序關閉資源,因爲Statement和
ResultSet是需要連接時纔可以使用的,所以在使用結束之後有可能其它的Statement還需要連接,所以不能現關閉Connection。
4jdbc的不足
儘管JDBC在JAVA語言層面實現了統一,但不同數據庫仍舊有許多差異。爲了更好地實現跨數據庫操作,於是誕生了Hibernate項目,Hibernate是對JDBC的再封裝,實現了對數據庫操作更寬泛的統一和更好的可移植性。
1.批處理時即可以用statement ,也可以用preparedstatement,一般可用後者。用後者的特點:
PreparedStatement ps = con.prepareStatement(sqlURL+"?,?,?,?,null)");
ps.addBatch(sqlURL);
ps.addBatch(sqlURL2);
ps.addBatch(sqlURL3)
ps.execute()//是用來執行初始化語句
ps.executeBatch()//是用來執行ps.addBatch中的語句。
對於statement也用此特點。但.createStatement不能初始化.但可用stet.updateExecuate(sql) .
2.批處理有一個完整的sql操作過程的需要。它可以決定操作的回不回退,來確定操作的特徵:
使用批處理是要考慮到異常的後果,是否已經到達操作的目的。
3.二個表沒辦法通過sql語句合併,只是select 和 jion能獲取一個二個表的結果集合而已。
唯一的辦法:一個個的讀取,一個個的insert。
4.批處理中不能有b/lob類型進行preparedStatement.setC/Blob()。
二.SQL語句:
1.對於update,insert等都可以用?表示當時未用,然後對其進行setxxx("")即補上.
2.對於integer類型的字段可以採用自動增長的方式:*聲明標的方式如下:
createURL=CREATE TABLE netPage( orderList INT AUTO_INCREMENT, url VARCHAR(200), title VARCHAR(50), createTime DATE, file TEXT,PRIMARY key(orderList), KEY(url) )
注當設定二個KEY值時,數據庫先檢驗第一個key,如果沒有相同的就不檢驗第二個,如果有才檢驗。只有當某行的二個key都一樣時才報錯。
3.當要對錶進行清空要用TRUNCATE TABLE netpagebak,如果用delete *的話,就會當表爲空時,回報錯 。
4.DELETE netPageBak.* FROM netPageBak,netPage WHERE netPageBak.url=netPage.url 的意思是:
從netPageBak中刪除含有與netpage中url相同的url行。
5.在用到數據庫的字段是要回避含有:的string作爲某一個字段的值。會出異常的(sql語法不對)。
6.使用RowSet.getString(int),該int從1開始對應相關的列字段。
三.數據類型:
1.在用到where語句的條件是:=null;將會被認爲沒有條件一樣,即使對應的確實有字段的值爲null.一搬在該字段爲null時,可用該字段的默認值,或空值。
2。可用limit語句對檢索的行數結果限制。例:
SELECT * FROM netPage WHERE createTime="" LIMIT 10
注:LIMIT 接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量(從第幾行開始)(可選),第二個參數指定返回記錄行的最大數目。這是mysql的使用方法,其他數據庫有類似的操作。
四.異常:
1。在設計方法來共享同一個connection 時,要注意有關異常產生的情況,可能導致connection沒有及時關閉,因此要在每一個異常出現時設置關閉connection
2.java.sql.SQLException: Unable to connect to any hosts due to exception: java.net.ConnectException: Connection refused: connect
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1797)
at com.mysql.jdbc.Connection.<init>(Connection.java:562)
其異常是由於數據庫的連接出問題了。
五.數據庫大對象:
一.當有大對象的使用:
1.COLB是代表大的數據(字符型) Blob代表大的二進制數據類型 對於這些大對象而言在初始的時候要付null值否則會出錯。
2.在用到sql語句的時候一定要保證語句的完整性。:
◆用逗號表示字段之間的間隔。
◆對於含values的語句注意括符的匹配。
◆當用字符串表示sql語句是要注意''號來表示字符串。
例:sqlURL=sqlURL+num+",'"+hsStr+"','"+title+"','"+date.toString()+"',"+null+");";
注:sql結尾可無;
3.一般不採用blob,clob,而採用long,long raw的原因是:需要平臺的支持。