其實hibernate完全是建立在JDBC的基礎上的。
那為什麼還要用hibernate呢?
原因:使用JDBC查詢有太多重復性的轉換工作,連接數據庫的信息放在程序代碼中,一旦需要修改數據庫的信息時,必須重新修改,重新編譯。不利於程序的維護。
hibernate的優勢:
概括的說:hibernate是一個優秀的java持久化層解決方案。是當今主流的對象-關系映射工具。
1.松散耦合,hibernate既不會滲透到上層域模型中。也不會滲透到下層數據模型中軟件開發人員可以獨立設計域模型。不必強迫遵守任何規范
2.數據庫設計人員可以獨立設計數據庫。不必強迫遵守任何規范
3.對象-關系映射不依賴於任何程序代碼。如果需要修改對象-關系映射。隻需修改xml文件。不需要修改任何程序。提高瞭軟件的靈活性,復用性,並且使維護更加方便。
持久化和ORM:
狹義的理解: “持久化”僅僅指把域對象永久保存到數據庫中;廣義的理解,“持久化”包括和數據庫相關的各種操作(持久化就是將有用的數據以某種技術保存起來,將來可以再次取出來應用,數據庫技術,將內存數據一文件的形式保存在永久介質中(磁盤等)都是持久化的例子.)。
ORM:Object Relational Mapping 即對象關系映射。在編寫程序時,以面向對象的方式處理數據,保存數據時,卻以關系型數據庫的方式存儲,所以我們需要這個對象關系映射這個機制,將需要保存的對象與關系數據庫表建立聯系。簡單的說:ORM就是利用描述對象和數據庫之間的映射,自動的把java應用程序中的對象持久化到關系數據庫中的表。
大概瞭解後:我們開始一個hibernate的基礎小程序(CRUD)
首先導入jar包。前期工作不多說瞭。
首先創建主配置文件:hibernate.cfg.xml文件:這個文件是用於配置數據庫連接的信息和hibernate運行時所需要的各種屬性,該文件一定是放在src目錄下的。而且命名一定是hibernate.cfg.xml。
[java]
<span style="white-space:pre"> </span><!–數據庫連接信息–>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!– 數據庫方言。就是高訴hibernate用哪種數據庫,並提供不同的數據庫方言 –>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!– 顯示sql語句。在控制臺上顯示 –>
<property name="show_sql">true</property>
<!– 對數據類中的映射 –>
<mapping resource="com/test/bean/UserInfo.hbm.xml" />
然後在創建持久化映射文件:命名規范:類名.hbm.xml文件。一般都是放在實體類的同級目錄下的。
[java] view plaincopy
<class name="UserInfo" table="userinfo" lazy="true">
<!– name對應類中的屬性。colmun:對應數據庫表中的字段 –>
<id name="userId" column="userId" type="java.lang.Integer">
<!– 主鍵生成方式 –>
<generator class="increment"></generator>
</id>
<property name="userName" column="userName" type="java.lang.String" />
<property name="userPwd" column="userPwd" type="java.lang.String" />
<property name="userAge" column="userAge" type="java.lang.Integer" />
<property name="userBirthday" column="userBirthday" type="java.util.Date" />
</class>
然後就是POJO類瞭。
[java]
public UserInfo() {
super();
// TODO Auto-generated constructor stub
}
private Integer userId;//用戶id
private String userName;//用戶名
private String userPwd;//密碼
private Integer userAge;//年齡
private Date userBirthday;//出生日期
public UserInfo(String userName, String userPwd, Integer userAge,
Date userBirthday) {
super();
this.userName = userName;
this.userPwd = userPwd;
this.userAge = userAge;
this.userBirthday = userBirthday;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public Date getUserBirthday() {
return userBirthday;
}
public void setUserBirthday(Date userBirthday) {
this.userBirthday = userBirthday;
}
在就是:獲取Session實例對象:
[java]
public static SessionFactory sessionfactory;
static{
//創建會話工廠
sessionfactory=new Configuration().configure().buildSessionFactory();
}
public static Session getSession(){//獲取session對象
Session session=sessionfactory.openSession();
return session;
}
public static void closeSession(Session session){//關閉session對象
if(session!=null){
session.close();
}
}
最後就可以對用戶實行CRUD瞭。
先做一個save();
[java]
<span style="white-space:pre"> </span>Session session=HibernateUtil.getSession();//獲取session
Transaction tx=session.beginTransaction();//開啟事物
try {
Userinfo user=new Userinfo("zhangsan", "123", 18, new Date());
session.save(user);//保存對象
tx.commit();//提交事物
} catch (HibernateException e) {
if(tx!=null)
tx.rollback();//事物回滾
e.printStackTrace();
}
finally{
HibernateUtil.closeSession(session);//關閉session
}
一個簡單的保存用戶就OK瞭。實現瞭面向對象的編程。
例子太多就不多說瞭。簡單介紹下hibernate的API吧。
保存:把域對象永久保存到數據庫。 session.save(Object o)
更新:更新數據庫中域對象的狀態。 session.update(Object o)
刪除:從數據庫中刪除一個域對象。 session.delete(Object o)
查詢:根據特定的查詢條件,把符合查詢條件的一個或多個域對象從數據庫加載內在存中。
有兩種方式查詢:session.get(class,id)和session.load(class,id)
get和load的區別在於:如果沒有查詢到該數據的時候,get()會返回null,load()會拋出異常。
hibernate中的實體對象的三種狀態:
1.瞬時狀態:在使用持久化操作前,沒有數據庫中的數據有任何的聯系。
2.持久化狀態:即實體對象在hibernate框架所管理的狀態。與數據中的數據建立瞭聯系。
3.遊離狀態:當session對象關閉時,但是對象和數據庫中建立瞭聯系,這時該對象並未受到session實例的管理。稱之為遊離狀態。或者說是托管狀態。
作者:yy008871