Java知識總結-12
hql 查詢
內連接:
from Entity inner join [fetch] Entity.property
忽略fetch 關鍵字,我們得到的結果集中,每行數據都是一個Object 數組
fetch表名表明”右表”對象讀出後立即填充到對應的“左表”對象中。
左外連接:
from Entity left join [fetch] Entity.property
session.createQuery("from District d left join fetch d.streets s");
Hibernate的右外聯接語法如下
from Entity right join [fetch] Entity.property
from District d right join fetch d.streets s
查詢單個字段:
也就是需要的數據只是實體對象的某個屬性,HQL也可以簡單的做到
String hql =“select s.name from Street s”;
List.get(0).getClass()
對於實體單個屬性的查詢,Hibernate返回的對象都是該屬性的類型
查詢多個字段:
取了id和name的屬性內容。返回的List對象中,每個條目都是一個對象數組(Object[]),每個Object數組中依次保存我們所獲取的屬性數據。
經驗:為了使返回的結果更加符合面向對象風格,可以通過在HQL中動態構造對象實例的方法對數據進行封裝。
可以采用如下HQL語句:
“select new Street (id,name) from Street“
這樣返回的List對象中將保存Street對象。但必須在Street類中添加一個以id和name屬性為參數的構造方法
distinct:去重
什麽是緩存
在磁盤上的數據放到內存中一份,我們讀取的時候先從緩存中讀取,沒有再去磁盤上找
Hibernate緩存作用
為了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能
緩存分類
一級緩存(內部緩存)Session:對象
二級緩存:SessionFactory:對象
一級緩存介紹:
一級緩存又稱為“Session的緩存”,它是內置的,不能被卸載 在第一級緩存中,采用的是Key-Value的MAP方式來實現的。在緩存實體對象時,對象的主關鍵字ID是MAP的Key,實體對象就是對象的值。所以說一級緩存是以實體對象為單位進行存儲的。由session 自動管理
,使用同一 session 查找同一對象時,只對數據庫查詢一次--使用 key-value 形式存儲對象, key 是 oid ,value 是對象,不能被卸載 (ehcath)
二級緩存作用
二級緩存又稱為“SessionFactory的緩存”,由於SessionFactory對象的生命周期和應用程序的整個過程對應,因此Hibernate二級緩存是進程範圍或者集群範圍的緩存,有可能出現並發問題,因此需要采用適當的並發訪問策略 默認關閉 使用第三方插件
sessionFactory 緩存(二級緩存):
hql 查詢的 list 方法 : 只會從三級緩存中查詢 不會從 1 2 級緩存中查詢
iterate 方法 會使用 1 2 緩存 ,不會使用三級緩存 先查詢所有ID 用到再查詢得到 類
配置二級緩存
1.首先導入ehcache.jar二級緩存包。
2.然後,在 src 下添加ehcache.xml配置,
3.同時,在hibernate.cfg.xml中啟用二級緩存
<property name="hibernate.cache.use_second_level_cache"> true</property>
<property name="hibernate.cache.provider_class"> net.sf.ehcache.hibernate.EhCacheProvider</property>。
4.:指定使用二級緩存緩存哪種類型的對象,在hbm.xml中添加<cache region="sampleCache1" usage="read-only"/>
Hibernate數據庫訪問的步驟:
1)讀取並解析配置文件
Configuration conf = new Configuration().configure();
(2)讀取並解析映射文件,創建SessionFactory
SessionFactory sf = conf.buildSessionFactory();
(3)打開Session
Session session = sf.openSession();
(4)開始一個事務(增刪改必須,查詢操作可選)
Transaction tx = session.beginTransaction();
(5)數據庫操作。
session.save(user);//或者其他操作
session.save(tea);
(6)提交事務(回滾事務)
tx.commit();//tx.rollback();
(7)關閉session
session.close();
持久化:
我們以面向對象的方式組織程序,瞬時的數據也以對象的形式存在,而持久的數據多保存在關系型數據庫中。所以,在通常情況下,持久化要完成的操作就是把對象保存到關系型數據庫中,或者把關系型數據庫中的數據讀取出來以對象的形式封裝。
模塊測試:
添加junit需要的jar包
[email protected]
Outline視圖選擇要執行的Test方法右鍵run as 選擇junit Test
配置文件示例
實體類:
<hibernate-mapping>
<class name="cn.jbit.houserent.bean.User" table="users" schema="jbit">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="native" />
</id>
<property name="password" type="java.lang.String" >
<column name="password" />
</property>
<property name="telephone" type="java.lang.String" >
<column name="telephon” />
</property>
<property name="username" type="java.lang.String" >
<column name="username" />
</property>
</class>
</hibernate-mapping>
總配置文件; 名字必須是 hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<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">dgt</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">my</property>
<property name="show_sql">true</property>
<mapping resource="com/bawei/bean/ZUserrole.hbm.xml" />
<mapping resource="com/bawei/bean/ZUser.hbm.xml" />
</session-factory>
</hibernate-configuration>
**********************
lizy 配置對象的加載模式 lizy="true" 即時加載
cascade 是否級聯操作 all/delete/none/saveAndUpdate
inverse 是否由one方主動管理外鍵 true 由多方管理外鍵
查詢
全部 得到對象
一列 得到(字符串)集合
多列 得到對象數組集合 得到對象
條件查詢
占位 數字從 0 開始
命名參數綁定
封裝參數綁定 setproperties()
Java知識總結-12