[TOC]
Hibernate
1 直譯:冬眠 數(shù)據(jù)持久化框架 ORM框架
2 用處: 最終將JDBC 替換
uniqueResult 唯一結(jié)果
lazy 延遲加載
cascade 級(jí)聯(lián)
inverse 反轉(zhuǎn)
3 Hibernate 實(shí)現(xiàn)的步驟
導(dǎo)包
主配置文件和映射文件<將實(shí)體和表映射>
-
測(cè)試類 TestHibernste
測(cè)試類步驟:- 獲取配置 創(chuàng)建工廠 獲取session 執(zhí)行方法 處理結(jié)果 關(guān)閉session
具體操作
設(shè)置主配置文件
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!--主配置 -->
<session-factory>
<property name="connection.url">
jdbc:mysql://localhost:3306/user
</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<mapping resource="com/wxb/bean/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
映射文件設(shè)置
<?xml version="1.0" encoding="utf-8"?>
<!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.wxb.bean.User" table="user">
<id name="uid" column="uid" type="java.lang.Integer">
<generator class="increment" ></generator>
</id>
<property name="name" column="name" type="java.lang.String"></property>
</class>
</hibernate-mapping>
測(cè)試類
//獲取配置
Configuration cf=new Configuration().configure();
//創(chuàng)建工廠
SessionFactory sf = cf.buildSessionFactory();
//獲取session
Session session = sf.openSession();
//hql 語句獲取用戶信息
List<User> list = session.createQuery("from User").list();
顯示sql語句 格式化配置
- 顯示sql語句
<property name="hibernate.show_sql">true</property>
- 格式化
<property name="hibernate.format_sql">true</property>
session常用的方法
- save
- update
- delete
- saveOrUpdate 如果配置文件中設(shè)置的是自增長(zhǎng),新增是無需編號(hào) ,修改則需要編號(hào)
對(duì)象實(shí)體的三個(gè)狀態(tài)
- 自由狀態(tài)
- 持久狀態(tài)
- 游離狀態(tài)
get/load 區(qū)別
User us = (User) session.get(User.class, 46);
User use= (User) session.load(User.class, 46)
- 同樣都是可以通過編號(hào)獲取對(duì)象
區(qū)別在于編號(hào)不存在是,get返回null,而load則會(huì)報(bào)異常ObjectNotFoundException(需打印異常信息)
唯一結(jié)果 uniqueResult
Object object = session.createQuery("select count(*) from User").uniqueResult();
HQL-Hibernate 查詢語句 OOP+SQL
hq語句
/***
* hq語句查詢
*
*/
String hql1="from User order by uid desc"; //降序排列
String hql1="from User where name like'%云%'"; //模糊查詢
String hql1="from User where uid=1"; // 通過ID查詢
占位符
/**
* 占位符的三種方式
*
*/
- 使用 ? 填充序號(hào)從0開始
- 使用 :ui 填充參數(shù)序號(hào)從0開始
- 使用 :屬性 填充參數(shù)一樣是屬性 優(yōu)點(diǎn):和順序無關(guān)
``` java
String hql2="from User where uid=? or name=?";
List<User> list =session.createQuery(hql2)
.setParameter(0,29)
.setParameter(1,"齊天大圣")
.list();
for (User user : list) {
System.out.println(user);
}
String hql3="from User where uid=:ui and name=:na";
List<User> list =session.createQuery(hql3)
.setParameter("ui", 29)
.setParameter("na","齊天大圣")
.list();
for (User user : list) {
System.out.println(user);
}
String hql4="from User where uid=:uid and name=:name";
List<User> list =session.createQuery(hql3)
.setProperties(new User(29,"齊天大圣"))
.setFirstResult(0)
.list();
for (User user : list) {
System.out.println(user);
}
分頁
String hql1="from User order by uid desc"; //降序排列
List<User> list = session.createQuery(hql1)
.setFirstResult(0)
.setMaxResults(5)
.list();
for (User user : list) {
System.out.println(user);
}
原生SQL
方式1
/**
* 原生sql
*/
String sql="select * from user";
List<Object[]> list = session.createSQLQuery(sql).list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
方式2
List<User> list2 = session.createSQLQuery(sql).addEntity(User.class).list();
for (User user2 : list2) {
System.out.println(user2);
}
HQL 與SQL比較
HQL
優(yōu)點(diǎn):增刪改有專用的方法 ;輸出比較方便
缺點(diǎn):hql專用語法;屬性需要在模型;里面
-
原生 SQL
優(yōu)點(diǎn):使用靈活;獲取的數(shù)據(jù)不受限制;可用于復(fù)雜統(tǒng)計(jì)查詢;同樣支持增刪改
缺點(diǎn):輸出無法直接進(jìn)行模型化
注: 復(fù)雜查詢建議使用(子查詢/連接查詢)
ER 關(guān)系
映射文件的屬性
lazy 懶加載
lazy="true"/ 延遲加載
lazy="false" 立加載
立加載 就是在session 關(guān)閉之前,就會(huì)執(zhí)行完sql/hql 語句,在多對(duì)一(many- to-one)的情況下,需要設(shè)置為false,否則會(huì)報(bào)錯(cuò)
延遲加載 就是在session關(guān)閉前執(zhí)行一部分sql/hql語句,一對(duì)多(one-to-many)默認(rèn)為true
<!-- 一對(duì)多 -->
<set name="set" lazy="false" cascade="all">
<key column="deptno"></key>
<one-to-many class="com.wxb.bean.User"/>
</set>
<!-- 多對(duì)一 -->
<many-to-one name="dept" class="com.wxb.bean.Department" lazy="false">
<column name="deptno" ></column>
</many-to-one>
cascade 級(jí)聯(lián)
級(jí)聯(lián)新增
Department department=new Department("開天辟地");
User user=new User("盤古");
department.getSet().add(user);
user.setDept(department)
session.save(department);
tac.commit();
反轉(zhuǎn) inverse
一般默認(rèn)為false
當(dāng)設(shè)置為false 的時(shí)候,此時(shí)為不反轉(zhuǎn),為系統(tǒng)的智能模式,此時(shí)只需說明部分關(guān)系 即一對(duì)多的關(guān)系
當(dāng)設(shè)置為true的時(shí)候,為不反轉(zhuǎn) 需要程序員自己手動(dòng)維護(hù),說明全部關(guān)系 即一對(duì)多和多對(duì)一的關(guān)系
命名查詢
優(yōu)點(diǎn):sql或hql集中管理,方便發(fā)布之后維護(hù)
List <Object []>list = session.getNamedQuery("getMoneyMMA").setProperties(new User("%天%"))
.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
使用方法getNameQuery
sql 語句
<sql-query name="getMoneyMMA">
select max(money),min(money),avg(money) from user
</sql-query>
List <Object []>list = session.getNamedQuery("getMoneyMMA").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
hql 語句
<query name="getMoneyHQL">
<![CDATA[from User]]>
</query>
List list = session.getNamedQuery("getMoneyHQL").list();
for (Object object : list) {
System.out.println(object);
}
緩存
Hibernate實(shí)現(xiàn)了良好的Cache機(jī)制,可以借助Hibernate內(nèi)部的Cache迅速提高系統(tǒng)的數(shù)據(jù)讀取性能。Hibernate中的Cache可分為兩層:一級(jí)Cache和二級(jí)Cache。
一級(jí)Cache:
同一個(gè)session 查詢兩次 sql語句執(zhí)行一次
二級(jí)Cache:
工廠級(jí)別的緩存(sessionFactory)同一個(gè)sessionFactroy
實(shí)現(xiàn)步驟:
- 同一個(gè)seesionFactory
- 打開二級(jí)緩存設(shè)置
<property name="hibernate.cache.use_second_level_cache">true</property>
- 打開第三方插件支持
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
- 相應(yīng)的對(duì)象映射文件配置
<cache usage="read-write"/>
- 導(dǎo)包 commons-lonning-1.1.1jar
- lazy設(shè)置為默認(rèn) proxy
緩存查詢
<property name="hibernate.cache.use_query_cache">true</property>