1.搭建環境
1.1導入jar包(數據庫爲sqlserver)
1.2配置文件:名稱統一爲hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 配置session工廠 -->
<session-factory>
<!-- 用戶名和密碼 -->
<property name="hibernate.connection.password">****</property>
<property name="hibernate.connection.username">sa</property>
<!-- 配置數據庫驅動 -->
<property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<!-- 數據庫的連接 -->
<property name="connection.url">jdbc:sqlserver://localhost:1433;databaseName=heimashop</property>
<!-- 方言 (連接的是哪一個數據庫產品-->
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<!-- 後 臺輸出sql語句-->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate 隔離級別 -->
<property name="hibernate.connection.isolation">4</property>
指定session與當前線程綁定
<property name="hibernate.current_session_context_class">thread</property>
<!-- 生成數據表的方式-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 添加orm文件:映射類對象 -->
<mapping resource="cn/itheima/domain/Customer.hbm.xml"/>
</session-factory>
1.3創建實體類
public class Customer {
private Long cust_id;
private String cust_name;
private String cust_source;
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_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;
}
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
1.4創建orm映射文件<文件名稱與Customer類對應:Customer.hbm.xml>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 配置表與實體對象的關係 -->
<!-- package屬性:填寫一個包名.在元素內部凡是需要書寫完整類名的屬性,可以直接寫簡答類名了. -->
<hibernate-mapping package="cn.itheima.domain">
<!--
class元素: 配置實體與表的對應關係的
name: 完整類名
table:數據庫表名
-->
<class name="Customer" table="cus_customer">
<!-- id元素:配置主鍵映射的屬性
name: 填寫主鍵對應屬性名
column(可選): 填寫表中的主鍵列名.默認值:列名會默認使用屬性名
type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
每個類型有三種填法: java類型|hibernate類型|數據庫類型
not-null(可選):配置該屬性(列)是否不能爲空. 默認值:false
length(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度
-->
<id name="cust_id">
<!-- generator:主鍵生成策略 -->
<generator class="native"></generator>
</id>
<!-- property元素:除id之外的普通屬性映射
name: 填寫屬性名
column(可選): 填寫列名
type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
每個類型有三種填法: java類型|hibernate類型|數據庫類型
not-null(可選):配置該屬性(列)是否不能爲空. 默認值:false
length(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度
-->
<property name="cust_name" column="cust_name"></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_phone" column="cust_phone"></property>
<property name="cust_mobile" column="cust_mobile"></property>
</class>
</hibernate-mapping>
1.5創建工具類
public class HibernateUtils {
//創建配置對象,用於讀取hibernate配置文件
private static SessionFactory sf=null;
//1.使用Configuration讀取配置文件,默認讀取的是src下一個叫做hibernate.cfg.xml的文件
static{
Configuration conf=new Configuration().configure();
//2.創建SessionFactory
sf = conf.buildSessionFactory();
}
/**
* 提供獲取session方法,重新生成一個session
*/
public static Session openSession(){
Session session = sf.openSession();
return session;
};
/**
* 獲取當前線程的session,
*/
public static Session getCurrentSession(){
Session session = sf.getCurrentSession();
return session;
};
2.基本操作
1.save
public static void main(String[] args) {
//獲得session,,打開一個新的session對象
//session用於hibernate操作數據庫核心對象
Session session = HibernateUtils.openSession();
//.session獲得操作事務的Transaction對象,此爲獲得一個事務對象並開啓事務
Transaction ts=session.beginTransaction();
Customer cus=new Customer();//沒有id,沒有與session有關聯=》瞬時狀態
cus.setCust_name("旺達");瞬時狀態
session.save(cus);//保存
ts.commit();//提交事務
//ts.rollback();//回滾事務
session.close();//釋放資源--遊離狀態
}
2.get方法和load方法
/**
* 查詢 -- 根據主鍵查詢 get load
* 1.get方法
* 作用:
* 根據主鍵查詢數據
* 用法:
* 兩個參數
* 第一個參數是class類型,要查詢哪一個表,就寫哪一個表對應的實體類的class類型
* 第二個參數是一個實現了序列化接口的對象,可以傳遞一數字
* 2.load方法
* 作用:
* 根據主鍵查詢數據
* 用法:與get一模一樣
* get是即時加載
* load是延遲加載 -- 動態代理,生成了實體類的代理對象(javassist-3.20.0-GA.jar)
*/
@Test
public void test(){
Session session = HibernateUtils.openSession();
Transaction ts=session.beginTransaction();
//Customer customer = session.get(Customer.class, 1l);
//System.out.println(customer);
Customer customer=session.load(Customer.class, 1l);
System.out.println(customer);
ts.commit();//提交事務
//ts.rollback();//回滾事務
session.close();//釋放資源--遊離狀態
}
3.delete
public void test(){
Session session = HibernateUtils.openSession();
Transaction ts=session.beginTransaction();
//Customer customer = session.get(Customer.class, 1l);
//System.out.println(customer);
Customer customer=session.get(Customer.class, 1l);
session.delete(customer);
//System.out.println(customer);
ts.commit();//提交事務
//ts.rollback();//回滾事務
session.close();//釋放資源--遊離狀態
}
3.Hql基本語法3.1查詢所有
/**
*HQL Hibernate Query 語言
* 1.HQL操作的都是java類,而不是表
*2.在HQL中查詢所有,直接寫 from 實體類的名,不寫select *
*
*/
@Test
public void test(){
Session session = HibernateUtils.openSession();
Transaction ts=session.beginTransaction();
String sql="from Customer";
Query c = session.createQuery(sql);
List<Customer> list = c.list();
System.out.println(list);
ts.commit();//提交事務
//ts.rollback();//回滾事務
session.close();//釋放資源--遊離狀態
}
3.2帶條件查詢
/**
*HQL Hibernate Query 語言
* c.setParameter()第一個問號是從0開始算起
*
*/
@Test
public void test(){
Session session = HibernateUtils.openSession();
Transaction ts=session.beginTransaction();
String sql="from Customer where cust_name=?";
Query c = session.createQuery(sql);
c.setParameter(0, "百度");
List<Customer> list=c.list();
System.out.println(list);
ts.commit();//提交事務
//ts.rollback();//回滾事務
session.close();//釋放資源--遊離狀態
}
3.3分頁查詢
@Test
public void test(){
Session session = HibernateUtils.openSession();
Transaction ts=session.beginTransaction();
String sql="from Customer ";
Query c = session.createQuery(sql);
c.setFirstResult(1);//設置開始查詢位置
c.setMaxResults(2);//一次查詢多少條數據
List<Customer> list=c.list();
System.out.println(list);
ts.commit();//提交事務
//ts.rollback();//回滾事務
session.close();//釋放資源--遊離狀態
}
3.4聚合函數
/**
* 聚合函數
* 統計年齡大於18歲的有多少人
* 如果能夠保證查詢結果只有一條數據的話,那麼可以使用uniqueResult方法,查詢結果如果多於1條記錄,那麼就會報錯
* 可以使用uniqueResult根據主鍵進行查詢
* 如果查詢某幾個列,那麼返回的是一個Object數組,數組中保存的是每個列的值
*/
@Test
public void test(){
Session session = HibernateUtils.openSession();
Transaction ts=session.beginTransaction();
String sql="select count(cust_id) from Customer ";
Query c = session.createQuery(sql);
Object[] result =(Object[]) c.uniqueResult();
//List<Object[]> list=c.list();
System.out.println(result[0]);
ts.commit();//提交事務
//ts.rollback();//回滾事務
session.close();//釋放資源--遊離狀態
}
4.Critetia查詢
/**
* Criteria -- 只能用於查詢
* 添加查詢條件
* 使用criteria.add
* 括號中Restrictions.方法來進行條件查詢條件
* 如:Restrictions.eq(propertyName, value)
* 第一個參數:根據哪個字段進行查詢(實體類中的屬性名)
* 第二個參數:查詢時的參數值
* select * from employee where emp_name = '張三'
* 常用:
* eq 代表相等 =
* lt 代表小於 <
* le 代表小於等於 <=
* gt 代表大於 >
* ge 代表大於等於 >=
* ne 代表了不等於 != , <>
* between 代表了區間
* like 代表模糊查詢
*
*/
@Test
public void test(){
Session session = HibernateUtils.openSession();
Transaction ts=session.beginTransaction();
Criteria c = session.createCriteria(Customer.class);
c.add(Restrictions.eq("cust_id",1l));
c.add(Restrictions.lt("cust_age", 15));
List<Customer> list=c.list();
System.out.println(list);
ts.commit();//提交事務
//ts.rollback();//回滾事務
session.close();//釋放資源--遊離狀態
}
5.原生sql查詢,(複雜多表查詢推薦使用)
@Test
public void test(){
Session session = HibernateUtils.openSession();
Transaction ts=session.beginTransaction();
String sql="select * from cus_customer";
SQLQuery c = session.createSQLQuery(sql);
//如果需要將查詢結果進行映射
c.addEntity(Customer.class);
List<Customer> list=c.list();
System.out.println(list);
ts.commit();//提交事務
//ts.rollback();//回滾事務
session.close();//釋放資源--遊離狀態
}