1. 程式人生 > >hibernate和JDBC

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的二級快取。