一.為什么用Hibernate? 【核心:對象關系映射】
Hibernate是對jdbc的輕量級封裝,可以簡化數據庫連接操作,
在該框架之前,數據庫的操作步驟是:
1.根據連接字串獲取連接 2.執行sql語句 3.獲取結果集 4.從結果集提取數據
二.Hibernate怎么用?
1.引入框架所需要的包
2.配置 src/hibernate.cfg.xml,常用配置如下: 【hibernate.cfg.xml 該文件名由軟件自動生成,不能修改】
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="hbm2ddl.auto">update</property> //根據類自動建表 <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">java</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 自定義配置 --> <property name="show_sql">true</property> //顯示sql語句 <property name="format_sql">true</property> //格式化顯示sql語句 <!-- 映射文件 --> <mapping resource="com/bean/User.hbm.xml"/> </session-factory> </hibernate-configuration>
3.編寫實體類映射文件 User.hbm.xml 【文件名和實體類名字相同】
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bean.User" table="TEST_USER" > <id name="id"> <generator class="native"/> </id> <property name="uname"/> <property name="photo"/> </class> </hibernate-mapping>
4.進行具體查詢的業務邏輯【軟件導入框架時會默認添加一個獲取session的類】
package com.dao.impl; import org.hibernate.Session; import org.hibernate.Transaction; import com.bean.User; import com.dao.IUserDao; import com.util.HibernateSessionFactory; public class UserDaoImpl implements IUserDao{ @Override public Integer addUser(User u) { int result = -1; //獲取會話 Session session = HibernateSessionFactory.getSession(); Transaction tx = session.beginTransaction(); try { //保存數據 session.save(u); tx.commit(); result=1; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //關閉 session.close(); return result; } }
三,Hibernate高級知識:
1.對象關系映射
當一個類里,把另一個類作為屬性使用時,怎么用映射文件來反映這種關系?
這就是對象關系映射,參考上一篇對象關系映射文章
2.Hibernate查詢:Query查詢,Criteria查詢 [不常用的本地查詢,native查詢]
Query查詢:
//獲取會話
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction(); String hql="from Admin as admin where admin.aname=:name";//使用命名參數,推薦使用,易讀。 Query query=session.createQuery(hql); query.setString("name", name);
List<Admin> list=query.list(); for(Admin admin:list){ System.out.println(admin.getAname()); }
Criteria查詢:
Restrictions-條件查詢,默認獲取全部
Projections-聚合查詢,如求和,平均值
//獲取會話
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
Criteria c=session.createCriteria(Admin.class); c.add(Restrictions.eq("aname",name));//eq是等於,gt是大於,lt是小於,or是或 c.add(Restrictions.eq("apassword", password)); List<Admin> list=c.list(); for(Admin admin:list){ System.out.println(admin.getAname()); }
四,Hibernate查詢優化
1.延時加載:當一個類的屬性是另一個類的時候,只顯示本類屬性,
用法:配置set-lazy屬性即可,默認開啟
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.crazyit.app.domain"> <!-- 映射 Person 持久化類 --> <class name="Person" table="person_inf"> <!-- 映射標識屬性 id --> <id name="id" column="person_id"> <!-- 定義主鍵生成器策略 --> <generator class="identity"/> </id>
<!-- 用於映射普通屬性 --> <property name="name" type="string"/> <property name="age" type="int"/>
<!-- 映射集合屬性 --> <set name="addresses" table="person_address" lazy="true"> 。。。 </set> </class> </hibernate-mapping>
2.抓取策略:和延時差不多,
用法:配置set-fetch屬性即可,默認開啟
五,Hibernate緩存
1.一級緩存默認開啟,session不關閉同一查詢,語句只執行一次
2.二級緩存,由第三方提供,可以於session關閉情況下進行歷史查詢
導入第三方包
在配置文件里添加開啟配置