JDBC之簡介
DriverManager類(驅動管理器),它可以創建連接,它本身就是一個創建Connection的工廠(Factory)。
Driver接口 入口
Connection接口,會根據不同的驅動產生不同的連接
Statement接口,發送sql語句
ResultSet接口(結果集),是用來接收select語句返回的查尋結果的。其實質類似于集合。
以上的資源都需要釋放,釋放的是數據庫的資源
JDBC應用步驟
1,注冊加載一個driver驅動
2,創建數據庫連接(Connection)
3,創建一個Statement(發送sql)
4,執行sql語句
5,處理sql結果(select語句)
6,關閉Statement
7,關閉連接Connection。
注意:6,7兩個步驟勢必須要做的,因為這些資源是不會自動釋放的,必須要自己關閉
訪問Oracle的數據庫的驅動名字叫o加到環境變量PATH中。
jdbc14.jar,這個jar文件中出訪的驅動程序的.class文件
要使用這個驅動程序,要先將他
一,注冊加載驅動driver,也就是強制類加載
1、Class.forName(driver);
driver = "oracle.jdbc.driver.OracleDriver";
2、Driver d=new Driver類();
Driver d = new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver(d);
3、編譯時利用虛擬機的系統屬性
java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver 類名(文件)
oracle的Driver的全名oracle.jdbc.driver.OracleDriver
mysql的Driver的全名com.mysql.jdbc.Driver
SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver
二,創建連接
DriverManager.getConnection(String url,String username,String password);
Connection連接是通過DriverManager的靜態方法getConnection(.....)來得到的,這個方法的實質是把參數傳到實際的Driver中的connect()方法中來獲得數據庫連接的。
oracle的URL值是由連接數據庫的協議和數據庫的IP地址及端口號還有要連接的庫名(DatebaseName)
oracle URL的格式
jdbc:oracle:thin:(協議)@XXX.XXX.X.XXX:XXXX(IP地址及端口號):XXXXXXX(所使用的庫名)
例:jdbc:oracle:thin:@192.168.0.39:1521:TARENADB
MySql URL的寫法
例: jdbc:mysql://192.168.8.21:3306/test
SQLServer URL的寫法
例:jdbc:microsoft:sqlserver://192.168.8.21:1433
java -Djdbc.drivers=驅動全名 類名
使用系統屬性名,加載驅動 -D表示為系統屬性賦值
使用Connection對象獲得一個Statement,Statement中的executeQuery(String sql) 方法可以使用select語句查詢,并且返回一個結果集 ResultSet通過遍歷這個結果集,
可以獲得select語句的查尋結果,ResultSet的next()方法會操作一個游標從第一條記錄的前邊開始讀取,直到最后一條記錄。
executeUpdate(String sql) 方法用于執行DDL和DML語句,可以update,delete操作。
注意:要按先ResultSet結果集,后Statement,最后Connection的順序關閉資源,因為Statement和ResultSet是需要連接是才可以使用的,
所以在使用結束之后有可能起他的Statement還需要連接,所以不能現關閉Connection。
作業:修改StudentDao的設計以及實現和測試程序,來完成從命令行傳遞學生的信息。
第二季
一、提問
如何進行代碼復用
繼承復用、組合復用
私有復用:一個方法在一個類的內部使用
工具方法:使用靜態方法,使用類名直接調用
二、Statement
execute(sql); 當不知道執行的SQL語句是什么類型的時候執行 ,返回值是boolean
executeQuery(sql); 執行查詢語句
executeUpdate(sql); 執行更新語句
三、PreparedStatement
可以使用參數替代sql語句中的某些參數使用 "?"代替,他先將帶參數的sql語句發送到數據庫,進行編譯,然后PreparedStatement會將參數發送給數據庫。
在使用PreparedStatement時,在設置相應參數時,要指明參數的位置和類型,以及給出參數值
根據不同的參數類型使用不同的setXXX(參數的位置,參數值)來設置參數
例:
public void insert(Student s){
Connection con=ConnectionFactory.getConnection();//建立連接
String sql="insert into student(id,name) values(?,?)";
PreparedStatement ps=null;
try {
ps=con.prepareStatement(sql);//創建一個PreparedStatement
int index=1;
ps.setInt(index++,s.getStuId()); //為參數賦值
ps.setString(index++,s.getName());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
if(ps!=null)
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(con!=null)
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
CallableStatement是可以用非sql語句來訪問數據庫,他是通過調用存儲過程(PL/SQL)來訪問數據庫的。可以直接使用連接來調用 prepareCall(...)方法,來執行這個存儲過程,"..."是存儲過程的名字。
對于系統時間要去數據庫時間
TimeStamp 和 Date都可以保存時間
TimeStamp可以保存時、分、秒的數據,Date只保存日期年月的信息。
SQLException是檢查異常必須處理要么throws ,要么try{}catch(){}
getErrorCode()可以獲得錯誤碼,可以對錯誤進行查詢。
四、源數據
JDBC中有兩種源數據,一種是數據庫源數據,另一種是ResultSet源數據。
源數據就是描述存儲用戶數據的容器的數據結構。
ResultSet rs=ps.executeQuery(sql);
ResultSetMetaData m=rs.getMetaData();
getColumnCount(),獲得實際列數
getColumnName(int colnum),獲得指定列的列名
getColumnType(int colnum),獲得指定列的數據類型
getColumnTypeName(int colnum),獲得指定列的數據類型名
//打印結果集
public static void printRS(ResultSet rs)throws SQLException{
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next()){
for(int i = 1 ; i < = rsmd.getColumnCount() ; i++){
String colName = rsmd.getColumnName(i);
String colValue = rs.getString(i);
if(i>1){
System.out.print(",");
}
System.out.print(name+"="+value);
}
System.out.println();
}
}
五、數據庫源數據
DatabaseMetaData
getURL(),獲得連接數據庫的URL
getDatabaseProductName() 獲得數據庫產品的名稱
getDriverVersion() 獲得JDBC驅動程序的String形式的版本號
getTables()獲得數據庫中該用戶的所有表
getUserName() 獲得數據庫用戶名。
六、事務(Transaction)
事務是針對原子操作的,要求原子操作不可再分,要求原子操作必須同時成功同時失敗。
事務是捆綁的原子操作的邊界。
JDBC中使用事務,先要使用連接調用setAutoCommite(false)方法,把自動提交(commit)置為false。打開事務就要關閉自動提交。不用事務是要把setAutoCommite(true)
在處理事務時,在發送sql語句后執行成功并確認時,就在try塊中使用連接調用commit()方法來發送提交信息,
在發送sql語句后執行失敗時,會在catch語句塊中使用連接調用rollback()方法來發送回滾信息,也可以在需要時做回滾操作(主觀原因)。
七、JDBC事務并發產生的問題和事務隔離級別
1,臟讀(dirty read),讀取到了沒有提交的數據。
2,不可重復讀(UnPrpeatable Read),兩次讀取到了不同的數據,就是要保持在同一時間點上兩次讀取到的數據相同,
不能夠使查詢數據時進行改變。
3,幻讀(phantom),在兩次查詢同一時間點數據時,數據數量發生改變,要保持在同一時間點上兩次讀取到的數據相同。
事務隔離級別
TRANSACTION_NONE不使用事務。
TRANSACTION_READ_UNCOMMITTED 可以讀取為提交數據。
TRANSACTION_READ_COMMITTED可以避免臟讀,不能夠讀取沒提交的數據,最常用的隔離級別 大部分數據庫的默認隔離級別
TRANSACTION_REPEATABLE_READ可以避免臟讀,重復讀取,
TRANSACTION_SERIALIZABLE可以避免臟讀,重復讀取和幻讀,(事務串行化)會降低數據庫效率
以上的五個事務隔離級別都是在Connection類中定義的靜態常量,使用setTransactionIsolation(int level) 方法可以設置事務隔離級別。
八,異常的處理
try{}
catch(SQLException){}
try{}
catch(Exception){}