一、JDBC
1.JDBC
Java數據庫連接,用於Java程序中實現數據庫操作功能,java.sql包中提供了執行SQL語句,訪問各種數據庫的方法,並為各種不同的數據庫提供統一的操作接口及類。
2.操作步驟
- 加載JDBC驅動器,將JDBC驅動加載到classpath中。
- 加載JDBC驅動,並將其注冊到DriverManager中。一般使用反射機制class.forName(String driverName)
- 建立數據庫連接,取得Connection對象。一般通過DriverManager.getConnection(url,username,passwd)方法實現,其中url表示連接數據庫的字符串,uaername表示連接數據庫的用戶名,passwd表示連接數據庫的密碼。
- 建立Statement對象或PrepareStatement對象。
- 執行SQL語句。
- 訪問結構集ResultSet對象。
- 依次訪問ResultSet、Statement、PreparedStatement、Connection對象關閉,釋放掉所占用的資源。
3.舉例舉出一個用訪問MySQL的例子
二、JDBC處理事務采用的方法
1.事務:用戶定義的一個數據庫操作序列,這些操作要么全做,要么全部不做,是一個不可分割的工作單元。
2.事務的特性:
- 原子性——由數據庫的恢復機制控制
- 隔離性——由數據庫的兵法控制機制控制
- 一致性——由原子性、隔離性、持久性一起控制
- 持久性——由數據庫恢復機制控制
3.事務的方法
- 事務開始begin trans
- 事務提交 commits,默認自動提交,但可以通過setAutoCommit(false)方法來禁止自動提交
- 事務回滾 rollback
- 事務結束 end trans
4.JDBC有哪些事務的隔離級別?
為了解決與“多個線程請求相同數據”相關的問題,事務之間通常會用鎖相互隔離開。
- TEANSACTION_NONE JDB 不支持事務
- TRANSCTION_READ_UNCOMMITTED 未提交讀——說明提交前一個事務可以看到另一個事務的變化。這樣讀“臟”數據、不可重復讀和虛度都是允許的
- TRANSCTION_READ_COMMITTED 已提交讀——說明讀取為題教的數據是不允許的,這個級別仍然允許不可重復讀和虛讀
- TRANSCTION_READ_COMMITTED 可重讀讀——說明事務保證能再次讀取相同的數據而不會失敗,但是虛讀仍然會出現。
- TRANSCTION_SERIALIZABLE 可序列化——能防止讀“臟”數據、不可重復讀、虛讀
備注:
- 讀“臟”數據:一個事務讀到另一個事務尚未提交的數據,則另一個事務更新時,一個事務讀取的數據就是“臟”數據。
- 不可重復讀:一個事務的操作導致另一事務前后兩次讀到不同的數據。
- 虛讀:一個事務的操作導致另一個事務前后兩次查詢的結果數據量不同。
三、Class,forName的作用
把類加載到JVM中,它會返回一個與帶有給定字符串名的類或接口相關聯的Class對象,並且JVM會加載這個類,同時JVM會執行該類的靜態代碼段
四、Statement、PreparedStatement和CallableStatement的區別
- Statement用來執行不帶參數的簡單的SQL語句,並返回它鎖生成結果的對象,每次執行SQL語句時,數據庫都要編譯改SQL語句
- PreparedStatement表示預編譯的SQL語句的對象,用於執行帶參數的預編譯SQL語句
- CallableStatement則提供了用來調用數據中存儲過程的接口,如果有輸出參數要注冊,說明是輸出參數。
Statement、PreparedStatement雖然能夠完成相同的功能,但是PreparedStatement具有以下優點:
- 效率更高。每當執行一個PreparedStatement對象時,由於在緩沖區中可以發現預編譯命令,雖然它會再被解析一次,但不會再被編譯,是可以重復使用的,從而能夠提高系統性能。
- 代碼可讀性和可維護性好
- 安全性更好,能夠預防SQL注入,SQL注入指的是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器,達到執行惡意SQL語句的目的。
五、getString()方法與getObject()方法有什么區別?
JDBC提供了getString()、getInt()和getData()等方法從ResultSet中獲取數據,當查詢結果集中的數據量較小時,不用考慮性能,但是當查詢結果集中的數據量非常大的時候,會拋出異常,通常情況下,使用getObject()方法可以解決這個問題。
getString()或getInt()等方法在調用時,程序會一次性地把數據都放在內存中,然后通過調用ResultSet的next()和getString()等方法來獲取數據。當數據大到內存中放不下的時候就會拋出異常。而使用getObject()方法就不會有這種問題,因為數據不會一次性地被讀到內存中,每次調用時會直接從數據庫中獲取數據,因此使用這種方法不會因為數據過而出錯。
六、使用JDBC要注意哪些問題?
編程時,一定要保證釋放不再使用的連接
七、什么是JDO
Java數據對象是一個用於存取某種數據倉庫中的對象的標准化API,它會使開發人員能夠間接訪問數據庫。
八、JDBC與Hibernate有什么區別?
Hibernate是JDBC的封裝,采用配准文件的形式將數據庫的連接參數寫到XML文件中,至於對數據庫的訪問仍然使用JDBC來完成。