layout: post
title: hibernate
subtitle: 用法
date: 2018-05-08
author: ZL
header-img: img/20180508.jpg
catalog: true
tags:
- hibernate
介紹
hibernate是一個(gè)關(guān)于數(shù)據(jù)庫的框架。
好處
完全面向?qū)ο蟛僮鲾?shù)據(jù)庫
操作數(shù)據(jù)庫的時(shí)候,可以以面向?qū)ο蟮姆绞絹硗瓿?不需要書寫SQL語句
搭建demo
步驟
下載hibernate
https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
下載解壓后有l(wèi)ib文件夾泛烙,下面有required文件夾埃脏,里面有必須的jar包。-
創(chuàng)建一個(gè)數(shù)據(jù)庫
image -
新建javaweb項(xiàng)目并導(dǎo)包
image
image -
創(chuàng)建一個(gè)bean類,用于保存數(shù)據(jù)
數(shù)據(jù)庫有什么字段,就創(chuàng)建對(duì)應(yīng)的變量鲁沥,然后添加set堤魁,get方法。
package domain; public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkman; private String cust_phone; private String cust_mobile; public Long getCust_id() { return cust_id; } public void setCust_id(Long cust_id) { this.cust_id = cust_id; } public String getCust_name() { return cust_name; } public void setCust_name(String cust_name) { this.cust_name = cust_name; } public String getCust_source() { return cust_source; } public void setCust_source(String cust_source) { this.cust_source = cust_source; } public String getCust_industry() { return cust_industry; } public void setCust_industry(String cust_industry) { this.cust_industry = cust_industry; } public String getCust_level() { return cust_level; } public void setCust_level(String cust_level) { this.cust_level = cust_level; } public String getCust_linkman() { return cust_linkman; } public void setCust_linkman(String cust_linkman) { this.cust_linkman = cust_linkman; } public String getCust_phone() { return cust_phone; } public void setCust_phone(String cust_phone) { this.cust_phone = cust_phone; } public String getCust_mobile() { return cust_mobile; } public void setCust_mobile(String cust_mobile) { this.cust_mobile = cust_mobile; } @Override public String toString() { return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]"; } }
-
在bean類customer的統(tǒng)計(jì)目錄下铐姚,創(chuàng)建Customer.hbm.xml
這個(gè)文件的作用是一個(gè)映射的作用策肝,將數(shù)據(jù)庫中的內(nèi)容和bean類customer對(duì)應(yīng)起來。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 這部分是約束內(nèi)容 --> <!-- 配置表與實(shí)體對(duì)象的關(guān)系 --> <!-- package屬性:填寫一個(gè)包名.在元素內(nèi)部凡是需要書寫完整類名的屬性,可以直接寫簡答類名了. --> <hibernate-mapping package="domain" > <!-- class元素: 配置實(shí)體與表的對(duì)應(yīng)關(guān)系的 name: 完整類名 table:數(shù)據(jù)庫表名 --> <class name="Customer" table="cst_customer" > <!-- id元素:配置主鍵映射的屬性 name: 填寫主鍵對(duì)應(yīng)屬性名 column(可選): 填寫表中的主鍵列名.默認(rèn)值:列名會(huì)默認(rèn)使用屬性名 type(可選):填寫列(屬性)的類型.hibernate會(huì)自動(dòng)檢測實(shí)體的屬性類型. 每個(gè)類型有三種填法: java類型|hibernate類型|數(shù)據(jù)庫類型 not-null(可選):配置該屬性(列)是否不能為空. 默認(rèn)值:false length(可選):配置數(shù)據(jù)庫中列的長度. 默認(rèn)值:使用數(shù)據(jù)庫類型的最大長度 --> <id name="cust_id" > <!-- generator:主鍵生成策略 后面介紹生成策略 --> <generator class="native"></generator> </id> <!-- property元素:除id之外的普通屬性映射 name: 填寫屬性名 column(可選): 填寫列名 type(可選):填寫列(屬性)的類型.hibernate會(huì)自動(dòng)檢測實(shí)體的屬性類型. 每個(gè)類型有三種填法: java類型|hibernate類型|數(shù)據(jù)庫類型 not-null(可選):配置該屬性(列)是否不能為空. 默認(rèn)值:false length(可選):配置數(shù)據(jù)庫中列的長度. 默認(rèn)值:使用數(shù)據(jù)庫類型的最大長度 --> <property name="cust_name" column="cust_name" > <!-- <column name="cust_name" sql-type="varchar" ></column> --> </property> <property name="cust_source" column="cust_source" ></property> <property name="cust_industry" column="cust_industry" ></property> <property name="cust_level" column="cust_level" ></property> <property name="cust_linkman" column="cust_linkman" ></property> <property name="cust_phone" column="cust_phone" ></property> <property name="cust_mobile" column="cust_mobile" ></property> </class> </hibernate-mapping>
-
書寫主配置文件
在src目錄下創(chuàng)建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"> <hibernate-configuration> <session-factory> <!-- 數(shù)據(jù)庫驅(qū)動(dòng) --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 數(shù)據(jù)庫url --> <property name="hibernate.connection.url">jdbc:mysql:///test01</property> <!-- 數(shù)據(jù)庫連接用戶名 --> <property name="hibernate.connection.username">root</property> <!-- 數(shù)據(jù)庫連接密碼 --> <property name="hibernate.connection.password">123456</property> <!-- 數(shù)據(jù)庫方言 不同的數(shù)據(jù)庫中,sql語法略有區(qū)別. 指定方言可以讓hibernate框架在生成sql語句時(shí).針對(duì)數(shù)據(jù)庫的方言生成. sql99標(biāo)準(zhǔn): DDL 定義語言 庫表的增刪改查 DCL 控制語言 事務(wù) 權(quán)限 DML 操縱語言 增刪改查 注意: MYSQL在選擇方言時(shí),請(qǐng)選擇最短的方言. --> <!-- #hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 將hibernate生成的sql語句打印到控制臺(tái) --> <property name="hibernate.show_sql">true</property> <!-- 將hibernate生成的sql語句格式化(語法縮進(jìn)) --> <property name="hibernate.format_sql">true</property> <!-- ## auto schema export 自動(dòng)導(dǎo)出表結(jié)構(gòu). 自動(dòng)建表 #hibernate.hbm2ddl.auto create 自動(dòng)建表.每次框架運(yùn)行都會(huì)創(chuàng)建新的表.以前表將會(huì)被覆蓋,表數(shù)據(jù)會(huì)丟失.(開發(fā)環(huán)境中測試使用) #hibernate.hbm2ddl.auto create-drop 自動(dòng)建表.每次框架運(yùn)行結(jié)束都會(huì)將所有表刪除.(開發(fā)環(huán)境中測試使用) #hibernate.hbm2ddl.auto update(推薦使用) 自動(dòng)生成表.如果已經(jīng)存在不會(huì)再生成.如果表有變動(dòng).自動(dòng)更新表(不會(huì)刪除任何數(shù)據(jù)). #hibernate.hbm2ddl.auto validate 校驗(yàn).不自動(dòng)生成表.每次啟動(dòng)會(huì)校驗(yàn)數(shù)據(jù)庫中表是否正確.校驗(yàn)失敗. --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 引入orm元數(shù)據(jù) 路徑書寫: 填寫src下的路徑 --> <mapping resource="domain/Customer.hbm.xml" /> </session-factory> </hibernate-configuration>
- 代碼測試(往數(shù)據(jù)庫中插入一條數(shù)據(jù))
package domain; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; import domain.Customer; public class Demo { @Test public void fun1(){ Configuration conf = new Configuration().configure(); SessionFactory sessionFactory = conf.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //---------------------------------------------- Customer c = new Customer(); c.setCust_name("google"); session.save(c); //---------------------------------------------- tx.commit(); session.close(); sessionFactory.close(); } }
注意
如果本地配置的是java9隐绵,那么需要在額外導(dǎo)入幾個(gè)包之众。這幾個(gè)包新版本java9沒有。
hibernate的API介紹
示例:
//事務(wù)操作
public void fun1(){
//1 創(chuàng)建,調(diào)用空參構(gòu)造
Configuration conf = new Configuration().configure();
//2 根據(jù)配置信息,創(chuàng)建 SessionFactory對(duì)象
SessionFactory sf = conf.buildSessionFactory();
//3 獲得session
Session session = sf.openSession();
//4 session獲得操作事務(wù)的Transaction對(duì)象
//開啟事務(wù)并獲得操作事務(wù)的tx對(duì)象(建議使用)
Transaction tx2 = session.beginTransaction();
//----------------------------------------------
增刪改查操作
//----------------------------------------------
tx2.commit();//提交事務(wù)
tx2.rollback();//回滾事務(wù)
session.close();//釋放資源
sf.close();//釋放資源
}
Configuration類
兩個(gè)作用:
- 加載主配置src下的hibernate.cfg.xml文件
Configuration conf = new Configuration(); conf.configure();
- 創(chuàng)建 SessionFactory對(duì)象
SessionFactory sf = conf.buildSessionFactory();
SessionFactory類
作用:
創(chuàng)建session對(duì)象
Session session = sf.openSession();
注意:
- sessionfactory 負(fù)責(zé)保存和使用所有配置信息.消耗內(nèi)存資源非常大.
- sessionFactory屬于線程安全的對(duì)象設(shè)計(jì).
所以保證在web項(xiàng)目中,只創(chuàng)建一個(gè)sessionFactory.
Session類
最核心的東西依许,增刪改查都靠它棺禾。
作用:
- 獲取事物:
- 方式一:
Transaction tx = session.getTransaction(); tx.begin();
- 方式二:
Transaction tx2 = session.beginTransaction();
- 方式一:
- 增刪改查(這里是最簡單的的增刪改查)
- 增
image -
刪(刪除id為1的數(shù)據(jù),第二個(gè)參數(shù)是id峭跳,類型是long)
image -
改
image -
查
image
Transaction類
作用:事物
獲取方式:
- 方式一:
Transaction tx = session.getTransaction(); tx.begin();
- 方式二:
Transaction tx2 = session.beginTransaction();
提交:
tx2.commit();//提交事務(wù)
回滾:
tx2.rollback();//回滾事務(wù)
HibernateUtils
增刪改查有一些重復(fù)代碼膘婶,按照J(rèn)ava的一貫作風(fēng),肯定是要封裝的蛀醉。
這里提供一個(gè)封裝的代碼:
package cn.itheima.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory sf;
static{
//1 創(chuàng)建,調(diào)用空參構(gòu)造
Configuration conf = new Configuration().configure();
//2 根據(jù)配置信息,創(chuàng)建 SessionFactory對(duì)象
sf = conf.buildSessionFactory();
}
//獲得session => 獲得全新session
public static Session openSession(){
//3 獲得session
Session session = sf.openSession();
return session;
}
//獲得session => 獲得與線程綁定的session
public static Session getCurrentSession(){
//3 獲得session
Session session = sf.getCurrentSession();
return session;
}
public static void main(String[] args) {
System.out.println(HibernateUtils.openSession());
}
}
使用:
public void save(Customer c) {
//1 獲得session
Session session = HibernateUtils.openSession();
//2 打開事務(wù)
Transaction tx = session.beginTransaction();
//3 執(zhí)行保存
session.save(c);
//4 提交事務(wù)
tx.commit();
//5 關(guān)閉資源
session.close();
}
hibernate中的實(shí)體規(guī)則(就是上面的bean類customer的注意事項(xiàng))
- 持久化類提供無參數(shù)構(gòu)造(默認(rèn)不寫就是)
- 成員變量私有,提供共有g(shù)et/set方法訪問(bean類都這樣子的呀)
- 持久化類中的屬性,應(yīng)盡量使用包裝類型(就是說用Double悬襟,Long,Integer而不是double拯刁,long脊岳,int)
- 持久化類需要提供oid.與數(shù)據(jù)庫中的主鍵列對(duì)應(yīng)(就是說數(shù)據(jù)庫中的主鍵在bean類中一定要有屬性對(duì)應(yīng),沒有主鍵的數(shù)據(jù)庫不能使用hibernate)
- 不要用final修飾class(就是說Customer不要用final修飾)
關(guān)于主鍵
在 Customer.hbm.xml中有配置主鍵生成策略垛玻。
<id name="cust_id" >
<!-- generator:主鍵生成策略-->
<generator class="native"></generator>
</id>
這里為了介紹主鍵生成策略就把主鍵也全部介紹一下逸绎。
主鍵要求
主鍵要求一個(gè)不能為空,必須要有夭谤,二個(gè)主鍵不能重復(fù)棺牧。
主鍵分類
- 如果一個(gè)表里面有一個(gè)列,他的值就滿足不為空且不重復(fù)朗儒,比如身份證號(hào)碼颊乘,然后就以這個(gè)列為主鍵的話,那么這種主鍵就叫做自然主鍵
- 多數(shù)時(shí)候會(huì)在表里面創(chuàng)建一個(gè)沒有意義的列醉锄,這個(gè)列滿足主鍵的條件乏悄,以這個(gè)列為主鍵,這種主鍵就叫做代理主鍵
主鍵生成策略(對(duì)代理主鍵而言)
自然主鍵:assigned
這個(gè)是表中的一個(gè)列恳不,具體什么值就錄入什么值檩小。
代理主鍵:(并不需要錄入,自動(dòng)生成烟勋,所以會(huì)有生成策略)
- identity :
主鍵自增.由數(shù)據(jù)庫來維護(hù)主鍵值.錄入時(shí)不需要指定主鍵.
- sequence:
Oracle中的主鍵生成策略.
- increment(了解):
主鍵自增.由hibernate來維護(hù).每次插入前會(huì)先查詢表中id最大值.+1作為新主鍵值.
- hilo(了解):
高低位算法.主鍵自增.由hibernate來維護(hù).開發(fā)時(shí)不使用.
- native:
hilo+sequence+identity 自動(dòng)三選一策略.
- uuid:
產(chǎn)生隨機(jī)字符串作為主鍵. 主鍵類型必須為string 類型.
- assigned:
自然主鍵生成策略(就是沒有策略),hibernate不會(huì)管理主鍵规求,由開發(fā)人員自己錄入筐付。
hibernate中的對(duì)象狀態(tài)
三種狀態(tài)
順勢狀態(tài)
沒有id,沒有在session緩存中,在內(nèi)存中是孤立存在的阻肿,與數(shù)據(jù)庫中的數(shù)據(jù)沒有任何關(guān)聯(lián)瓦戚。
持久化狀態(tài)
有id,在session緩存中
游離|托管狀態(tài)
有id,沒有在session緩存中
這里的有id是指有與數(shù)據(jù)中對(duì)應(yīng)的id,當(dāng)調(diào)用save方法以后就在數(shù)據(jù)庫中有了id
例子
public void fun1(){
Configuration conf = new Configuration().configure();
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//----------------------------------------------
Customer c = new Customer();//瞬時(shí)狀態(tài)
c.setCust_name("google公司");
session.save(c);//持久化狀態(tài)丛塌,有id,在session緩存中
//----------------------------------------------
tx.commit();//游離|托管狀態(tài)
session.close();
sessionFactory.close();
}
三種狀態(tài)的轉(zhuǎn)換
hibernate緩存
hibernate會(huì)有緩存的较解,不過這個(gè)理解一下就好,因?yàn)樵趯懘a的時(shí)候并沒有什么不一樣赴邻。
hibernate的一級(jí)緩存的作用就是減少對(duì)數(shù)據(jù)庫的訪問次數(shù)印衔。
hibernate的一級(jí)緩存有如下特點(diǎn):
- 當(dāng)應(yīng)用程序調(diào)用Session接口的save()、update()姥敛、saveOrUpdate()時(shí)当编、如果Session緩存中沒有相應(yīng)的對(duì)象,hibernate就會(huì)自動(dòng)的把從數(shù)據(jù)庫中查詢到的相應(yīng)對(duì)象信息加入到一級(jí)緩存中去徒溪。
- 當(dāng)調(diào)用Session接口的load()、get()方法以及Query接口的list()金顿、iterator()方法時(shí)臊泌,會(huì)判斷緩存中是否存在該對(duì)象,有則返回揍拆,不會(huì)查詢數(shù)據(jù)庫渠概,如果緩存中沒有要查詢對(duì)象,再去數(shù)據(jù)庫中查詢相應(yīng)對(duì)象嫂拴,并添加到一級(jí)緩存中播揪。
- 當(dāng)調(diào)用session的close()方法時(shí),session緩存會(huì)被清空筒狠。
比如:
Customer c1 = session.get(Customer,1l);
Customer c2 = session.get(Customer,1l);
這兩句代碼實(shí)際上只是查詢了一次數(shù)據(jù)庫猪狈。
hibernate指定事務(wù)的隔離級(jí)別
在數(shù)據(jù)庫的事務(wù)的那篇博客中有關(guān)于數(shù)據(jù)庫的事務(wù)的特性和隔離級(jí)別的介紹,這里就不再多加介紹了辩恼,就介紹一下如何在hibernate中指定數(shù)據(jù)庫的隔離級(jí)別
- read uncommitted : 讀取尚未提交的數(shù)據(jù) :哪個(gè)問題都不能解決
- read committed:讀取已經(jīng)提交的數(shù)據(jù) :可以解決臟讀 ---- oracle默認(rèn)的
- repeatable read:重復(fù)讀裙兔怼:可以解決臟讀 和 不可重復(fù)讀 ---mysql默認(rèn)的
- serializable:串行化:可以解決 臟讀 不可重復(fù)讀 和 虛讀---相當(dāng)于鎖表
在hibernate.cfg.xml中
在項(xiàng)目中確保使用同一個(gè)Session的例子:
在hibernate中,確保使用同一個(gè)session的問題,hibernate已經(jīng)幫我們解決了. 我們開發(fā)人員只需要調(diào)用sf.getCurrentSession()方法即可獲得與當(dāng)前線程綁定的session對(duì)象
注意:調(diào)用getCurrentSession方法必須配合主配置中的一段配置
注意2:通過getCurrentSession方法獲得的session對(duì)象.當(dāng)事務(wù)提交時(shí),session會(huì)自動(dòng)關(guān)閉.不要手動(dòng)調(diào)用close關(guān)閉.
service層:
dao層:
hibernate中的批量查詢(概述)
HQL: 多表查詢,但不復(fù)雜時(shí)使用
criteria:單表?xiàng)l件查詢
原生SQL:復(fù)雜業(yè)務(wù)查詢
HQL查詢
Hibernate獨(dú)家查詢語言,屬于面向?qū)ο蟮牟樵冋Z言
-
基本查詢(查詢所有記錄)
//基本查詢 public void fun1(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務(wù) Transaction tx = session.beginTransaction(); //3執(zhí)行操作 //------------------------------------------- //1> 書寫HQL語句 // String hql = " from cn.itheima.domain.Customer "; String hql = " from Customer "; // 查詢所有Customer對(duì)象 //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象 Query query = session.createQuery(hql); //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果 List<Customer> list = query.list(); // 返回list結(jié)果 //query.uniqueResult();//接收唯一的查詢結(jié)果 System.out.println(list); //------------------------------------------- //4提交事務(wù).關(guān)閉資源 tx.commit(); session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián) }
如果查詢的結(jié)果只有一個(gè):query.uniqueResult();
如果查詢的結(jié)果是一個(gè)集合:query.list();
-
條件查詢1.0
public void fun2(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務(wù) Transaction tx = session.beginTransaction(); //3執(zhí)行操作 //------------------------------------------- //1> 書寫HQL語句 String hql = " from Customer where cust_id = 1 "; //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象 Query query = session.createQuery(hql); //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果 Customer c = (Customer) query.uniqueResult(); System.out.println(c); //------------------------------------------- //4提交事務(wù).關(guān)閉資源 tx.commit(); session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián) }
from Customer where cust_id = 1中的cust_id是Customer類中的屬性的名字灶伊,而不是數(shù)據(jù)庫中cust_id字段的名字疆前。HQL語句中,不可能出現(xiàn)任何數(shù)據(jù)庫相關(guān)的信息的
-
條件查詢2.0(問號(hào)占位符)
public void fun3(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務(wù) Transaction tx = session.beginTransaction(); //3執(zhí)行操作 //------------------------------------------- //1> 書寫HQL語句 String hql = " from Customer where cust_id = ? "; //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象 Query query = session.createQuery(hql); //設(shè)置參數(shù) //query.setLong(0, 1l); query.setParameter(0, 1l); //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果 Customer c = (Customer) query.uniqueResult(); System.out.println(c); //------------------------------------------- //4提交事務(wù).關(guān)閉資源 tx.commit(); session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián) }
設(shè)置參數(shù)的兩種寫法:
- query.setLong、setboolean聘萨、setDouble等等竹椒,根據(jù)問號(hào)占位符的數(shù)據(jù)類型而選擇,參數(shù)1:第幾個(gè)問號(hào)米辐,從0開始計(jì)數(shù)胸完;參數(shù)二:該問號(hào)處的值书释。
- query.setParameter(0, 1l);這種不用區(qū)分問號(hào)占位符的數(shù)據(jù)類型了,參數(shù)1:第幾個(gè)問號(hào)舶吗,從0開始計(jì)數(shù)征冷;參數(shù)二:該問號(hào)處的值。
-
條件查詢3.0(命令占位符)
public void fun4(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務(wù) Transaction tx = session.beginTransaction(); //3執(zhí)行操作 //------------------------------------------- //1> 書寫HQL語句 String hql = " from Customer where cust_id = :aaa and cust_name = :bbb"; //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象 Query query = session.createQuery(hql); //設(shè)置參數(shù) query.setParameter("aaa", 1l); query.setParameter("bbb", "張三"); //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果 Customer c = (Customer) query.uniqueResult(); System.out.println(c); //------------------------------------------- //4提交事務(wù).關(guān)閉資源 tx.commit(); session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián) }
用aaa誓琼,bbb取代了問號(hào)占位符检激,這樣在設(shè)置參數(shù)時(shí)就不用去數(shù)第幾個(gè)問號(hào)了。
-
分頁查詢
public void fun5(){ //1 獲得session Session session = HibernateUtils.openSession(); //2 控制事務(wù) Transaction tx = session.beginTransaction(); //3執(zhí)行操作 //------------------------------------------- //1> 書寫HQL語句 String hql = " from Customer "; //2> 根據(jù)HQL語句創(chuàng)建查詢對(duì)象 Query query = session.createQuery(hql); //設(shè)置分頁信息 limit ?,? query.setFirstResult(1); query.setMaxResults(1); //3> 根據(jù)查詢對(duì)象獲得查詢結(jié)果 List<Customer> list = query.list(); System.out.println(list); //------------------------------------------- //4提交事務(wù).關(guān)閉資源 tx.commit(); session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián) }
query.setFirstResult(1);從第幾條記錄開始查詢腹侣,默認(rèn)0叔收;
query.setMaxResults(1);查詢幾條數(shù)據(jù)。
這兩個(gè)方法對(duì)應(yīng)了sql語句中l(wèi)imit ?,?的兩個(gè)問號(hào)傲隶。
Hibernate無語句面向?qū)ο蟛樵?/h2>
-
基本查詢(查詢所有)
public void fun1(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//查詢所有的Customer對(duì)象
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
System.out.println(list);
//Customer c = (Customer) criteria.uniqueResult();
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
-
條件查詢
public void fun2(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//創(chuàng)建criteria查詢對(duì)象
Criteria criteria = session.createCriteria(Customer.class);
//添加查詢參數(shù) => 查詢cust_id為1的Customer對(duì)象
criteria.add(Restrictions.eq("cust_id", 1l));
//執(zhí)行查詢獲得結(jié)果
Customer c = (Customer) criteria.uniqueResult();
System.out.println(c);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
sql條件
Restrictions.xx
>
gt
>=
ge
<
lt
<=
le
==
eq
!=
ne
in
in
between and
between
like
like
is not null
isNotNull
is null
isNull
or
or
and
and
-
分頁查詢
public void fun3(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//創(chuàng)建criteria查詢對(duì)象
Criteria criteria = session.createCriteria(Customer.class);
//設(shè)置分頁信息 limit ?,?
criteria.setFirstResult(1);
criteria.setMaxResults(2);
//執(zhí)行查詢
List<Customer> list = criteria.list();
System.out.println(list);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
-
查詢總記錄數(shù)
public void fun4(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//創(chuàng)建criteria查詢對(duì)象
Criteria criteria = session.createCriteria(Customer.class);
//設(shè)置查詢的聚合函數(shù) => 總行數(shù)
criteria.setProjection(Projections.rowCount());
//執(zhí)行查詢
Long count = (Long) criteria.uniqueResult();
System.out.println(count);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
原生SQL查詢
-
基本查詢(查詢所有)
public void fun2(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//1 書寫sql語句
String sql = "select * from cst_customer";
//2 創(chuàng)建sql查詢對(duì)象
SQLQuery query = session.createSQLQuery(sql);
//指定將結(jié)果集封裝到哪個(gè)對(duì)象中
query.addEntity(Customer.class);
//3 調(diào)用方法查詢結(jié)果
List<Customer> list = query.list();
System.out.println(list);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
-
條件查詢
public void fun3(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//1 書寫sql語句
String sql = "select * from cst_customer where cust_id = ? ";
//2 創(chuàng)建sql查詢對(duì)象
SQLQuery query = session.createSQLQuery(sql);
query.setParameter(0, 1l);
//指定將結(jié)果集封裝到哪個(gè)對(duì)象中
query.addEntity(Customer.class);
//3 調(diào)用方法查詢結(jié)果
List<Customer> list = query.list();
System.out.println(list);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
-
分頁查詢
public void fun4(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//1 書寫sql語句
String sql = "select * from cst_customer limit ?,? ";
//2 創(chuàng)建sql查詢對(duì)象
SQLQuery query = session.createSQLQuery(sql);
query.setParameter(0, 0);
query.setParameter(1, 1);
//指定將結(jié)果集封裝到哪個(gè)對(duì)象中
query.addEntity(Customer.class);
//3 調(diào)用方法查詢結(jié)果
List<Customer> list = query.list();
System.out.println(list);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
基本查詢(查詢所有)
public void fun1(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//查詢所有的Customer對(duì)象
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
System.out.println(list);
//Customer c = (Customer) criteria.uniqueResult();
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
條件查詢
public void fun2(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//創(chuàng)建criteria查詢對(duì)象
Criteria criteria = session.createCriteria(Customer.class);
//添加查詢參數(shù) => 查詢cust_id為1的Customer對(duì)象
criteria.add(Restrictions.eq("cust_id", 1l));
//執(zhí)行查詢獲得結(jié)果
Customer c = (Customer) criteria.uniqueResult();
System.out.println(c);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
sql條件 | Restrictions.xx |
---|---|
> | gt |
>= | ge |
< | lt |
<= | le |
== | eq |
!= | ne |
in | in |
between and | between |
like | like |
is not null | isNotNull |
is null | isNull |
or | or |
and | and |
分頁查詢
public void fun3(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//創(chuàng)建criteria查詢對(duì)象
Criteria criteria = session.createCriteria(Customer.class);
//設(shè)置分頁信息 limit ?,?
criteria.setFirstResult(1);
criteria.setMaxResults(2);
//執(zhí)行查詢
List<Customer> list = criteria.list();
System.out.println(list);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
查詢總記錄數(shù)
public void fun4(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//創(chuàng)建criteria查詢對(duì)象
Criteria criteria = session.createCriteria(Customer.class);
//設(shè)置查詢的聚合函數(shù) => 總行數(shù)
criteria.setProjection(Projections.rowCount());
//執(zhí)行查詢
Long count = (Long) criteria.uniqueResult();
System.out.println(count);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
基本查詢(查詢所有)
public void fun2(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//1 書寫sql語句
String sql = "select * from cst_customer";
//2 創(chuàng)建sql查詢對(duì)象
SQLQuery query = session.createSQLQuery(sql);
//指定將結(jié)果集封裝到哪個(gè)對(duì)象中
query.addEntity(Customer.class);
//3 調(diào)用方法查詢結(jié)果
List<Customer> list = query.list();
System.out.println(list);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
條件查詢
public void fun3(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//1 書寫sql語句
String sql = "select * from cst_customer where cust_id = ? ";
//2 創(chuàng)建sql查詢對(duì)象
SQLQuery query = session.createSQLQuery(sql);
query.setParameter(0, 1l);
//指定將結(jié)果集封裝到哪個(gè)對(duì)象中
query.addEntity(Customer.class);
//3 調(diào)用方法查詢結(jié)果
List<Customer> list = query.list();
System.out.println(list);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}
分頁查詢
public void fun4(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務(wù)
Transaction tx = session.beginTransaction();
//3執(zhí)行操作
//-------------------------------------------
//1 書寫sql語句
String sql = "select * from cst_customer limit ?,? ";
//2 創(chuàng)建sql查詢對(duì)象
SQLQuery query = session.createSQLQuery(sql);
query.setParameter(0, 0);
query.setParameter(1, 1);
//指定將結(jié)果集封裝到哪個(gè)對(duì)象中
query.addEntity(Customer.class);
//3 調(diào)用方法查詢結(jié)果
List<Customer> list = query.list();
System.out.println(list);
//-------------------------------------------
//4提交事務(wù).關(guān)閉資源
tx.commit();
session.close();// 游離|托管 狀態(tài), 有id , 沒有關(guān)聯(lián)
}