Hibernate學習(一)
Hibernate是一個持久化,ORM框架。 持久化:瞬時狀態和持久狀態之間的轉換機制。
Hibernate 使用步驟
1 匯入本地jar包或者使用maven pom下載對應hiberante jar包。 2 封裝實體類User(採用正向工程方式 實體類–表) 3 配置實體類對映檔案 User.hbm.xml(開頭與實體類名稱一致)
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.sunsharing.htest.entity.User" table="t_user" schema="htest">
<id name="userId" column="user_id">
<generator class="native"></generator>
</id>
<property name="userName" column="user_name" />
<property name="userPwd" column="user_pwd"/>
</class>
</hibernate-mapping>
4.配置Hibernate總配置檔案
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration >
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/htest?useUnicode=true&characterEncoding=utf8]]>
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/sunsharing/htest/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5.編寫測試類
import com.sunsharing.htest.entity.User;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;
public class Main {
public static void main(String[] args) {
//1 初始化配置檔案,並讀取裡面的資訊
Configuration config = new Configuration().configure();
//2 配置註冊器 hibernate3 不需要配置註冊器,而hibernate4則需要
ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(config.getProperties());
//3 建立sessionfactory
SessionFactory sf = config.buildSessionFactory(srb.buildServiceRegistry());
//4 開啟會話
Session session = sf.openSession();
//5 開啟事務
Transaction tran = session.beginTransaction();
//6進行相關語句操作
try {
// User user = new User();
// user.setUserName("對對對");
// user.setUserPwd("111");
// session.save(user);
User user = (User)session.get(User.class,1);
System.out.print(user.getUserName() + " " + user.getUserPwd());
} catch (Exception e) {
//事務回滾
tran.rollback();
}
//7 提交事務
tran.commit();
//8 關閉會話
session.close();
}
}
物件三種狀態:
瞬時狀態(new 出來的物件) 持久狀態(當前物件和資料庫表的一行資料一致,且所在的session沒有關閉) 遊離(脫管)狀態(當前物件和資料庫表的一行資料一致,且所在的session關閉) 三種狀態切換: 當物件是通過new方式構造出來的,那麼此時該物件是瞬時狀態物件,當呼叫save方法時,那麼該物件由瞬時狀態變成持久狀態,當持久狀態的物件呼叫delete方法後,該物件變成瞬時狀態。當一個物件是由get或者load等方法獲取得到,那麼此時該物件就是持久狀態的物件,當session關閉時,持久狀態的物件都是脫管狀態的物件。注意:瞬時狀態和脫管狀態是沒有辦法直接轉換的。
JDBC和Hibernate區別 相同點:1 都是資料庫操作的中介軟體 2 事務都需要顯式提交 3 都需要關閉 不同點:1 JDBC採用sql,Hibernate採用HQL。 2 JDBC操作的是表,Hibernate操作的是實體類 3 JDBC操作的物件都是瞬時的,Hibernate操作的物件都是可持久化的。
持久化持久類需要注意的事項: 1、為類的持久化欄位宣告訪問方法(get/set),Hibernate對JavaBeans風格的屬性實行持久化。 2、實現一個預設的構造方法(無參的),這樣的話Hibernate就可以使用Constructor.newInstance()方法來例項化物件。 3、如果是集合型別的屬性,它的型別必須定義為集合的介面,例如:List、Set(不要定義成ArrayList) 4、提供一個標識屬性(主鍵Identifier property),如果沒有該屬性,一些功能不起作用,比如:級聯更新,session.saveOrUpdate()。
get和load的區別 1 get方法返回的是真實物件,load方法返回的是代理物件 2 當查詢的資料id是沒有資料對應的情況下,get返回的是空物件,load方法會丟擲異常。
HQL特點 它是完全面向物件的查詢語句,查詢功能非常強大,具備繼承、多型和關聯等特性
HQL用面向物件的方式生成SQL
- 以類和屬性來代替表和資料列
- 支援多型
- 支援各種關聯
- 減少了SQL的冗餘
HQL支援所有的關係資料庫操作
- 連線(joins,包括Inner/outer/full joins),笛卡爾積(cartesian products)
- 投影
- 聚合和分組
- 排序
- 子查詢
- SQL函式
主鍵生成器 1 native 本地化,意味著無論底層是哪種資料庫,hibernate會自動選擇最合適的方式實現主鍵的自增。任何資料庫都能使用。 2 increment 在插入資料之前,先查詢當前表的最大id,在+1後作為插入資料的主鍵,任何資料庫都能使用。 3 Identity 要求底層資料庫必須支援主鍵自增,比如Mysql和SQL Server資料庫 4 sequence 要求底層資料庫要支援採用序列方式生成id,比如Oracle和DB2 資料庫 5 assigned 要求主鍵id必須是String型別的值,且該id的值由程式設計師自己錄入。 6 uuid-hex 由計算機生成的128bit的字串id。採用該主鍵自增策略的優點:保證多併發環境下id值都是唯一的,且有利於資料庫的合併。
關係關聯對映
多對一: 在實體類,多的一方的屬性要有一的方法的類物件; 在多的實體類對映檔案中配置many-to-one節點
<!-- 在該節點配置外來鍵物件 -->
<many-to-one name="person_role" cascade="all" lazy="false" ></many-to-one>
需要通過提交多的一方進而影響一的方法,得通過配置cascade=all來實現。如果需要通過查詢多的一方,順便取出一的方法,得通過配置lazy=false來實現(如果是預設懶載入方式,那麼會出現no session問題)
一對多: 在實體類,一的一方編寫set集合儲存多的一方 在一的實體類對映檔案