hibernate和JDBC
hibernate是對jdbc的封裝與擴充套件,和hibernate類似的orm框架還有mybatis、Entity EJB、OBJ等等。先介紹jdbc再介紹hibernate,弄清楚這兩種資料庫訪問技術,其他的orm框架就很容易學習了。
一.jdbc
jdbc是java為了訪問各種資料庫而提供的javaAPI,使用jdbc當然需要實現jdbc的jar包,連線mysql、oracle和db2需要各自的jar包,以mysql為例。
先以一個訪問資料庫的例子作為開頭,下面的程式碼實現了向資料庫插入一條記錄的功能。
public class JDBCTest { private static final String driver = "com.mysql.jdbc.Driver"; private static final String url = "jdbc:mysql://localhost:3306/test"; private static final String name = "root"; private static final String pwd = "root"; public static void test1(){ Connection conn = null; CallableStatement callStmt = null; PreparedStatement pre = null; try{ Class.forName(driver);//載入jdbc驅動 conn = DriverManager.getConnection(url,name,pwd);//通過DriverManager獲取一個連線 conn.setAutoCommit(false);//設定實務不是自動提交,事務預設是自動提交 pre = conn.prepareStatement("insert into sm_dept values(?,?,?)"); pre.setInt(1, 1); pre.setString(2, "name"); pre.setString(3, "123242434"); int results = pre.executeUpdate(); System.out.println("插入了"+results+"記錄"); }catch(Exception e){ try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } }finally{ try { conn.setAutoCommit(true); } catch (SQLException e) { e.printStackTrace(); } if(callStmt != null){ try { callStmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } public static void test2(){ } public static void main(String[] args) { JDBCTest.test1(); } }
幾個概念:
1.事務
事務是對資料庫執行一次操作的基本單位,事務是不可以再分的。對資料庫的增刪改差都是一個事務。
事務的4個特性:
(1).原子性,事務是最基本的單位,不能再分割成幾個步驟。
(2).隔離性,併發執行的各個事務之間不會相互影響。
(3).一致性,事務只會從一個狀態變成另外一個狀態,中間不會有其他狀態
(4).永續性,事務一旦提交之後,他對資料庫中資料的改變是永久的。
事務的5個隔離級別:
先明白3個概念:
髒讀:一個數據讀取了另外一個事務沒有提交的資料,而另外一個事務是有可能回滾;
不可重複讀:一個事務內的兩個相同的查詢,查出來的資料不一樣,這是因為其他事務修改資料提交而導致的;
幻讀:事務一對所有行進行了修改,事務二新插入一條資料,由於事務是隔離的,事務二插入的資料是基於事務一發生之前的,所以事務一完成之後會發現還沒有被修改的資料
就像發生了幻覺一樣;
用Connection的setTransactionIsolation(int level)
方法設定事物的隔離級別。
2.PreparedStatement和Statement的區別
(1).PreparedStatement是預編譯的,對於重複執行時效率高,Statement每次執行的時候都需要編譯。
(2).PreparedStatement更安全,可以防止sql注入式攻擊,注入式攻擊就是執行欺騙式的sql語句,達到非法操作資料庫的目的。
(3).加入引數的格式不一樣,PreparedStatement的可讀性更好。
二.Hibernate
hibernate是對jdbc的封裝與擴充套件,hibernate是一個orm框架,開發者通過直接操作物件實現對資料庫的操作,實現了物件模型和關係模型之間的對映。
hibernate和jdbc的幾點區別:
1.jdbc直接操作底層,效率更高。
2.jdbc不是面向物件程式設計,hibernate是面向物件的程式設計,更符合java程式設計師的思考方式。
3.hibernate封裝度更好,大大簡化了訪問資料庫程式碼的複雜性和重複性。
4.hibernate的快取機制更強大,有session級別的一級快取和sessionFactory的二級快取。