Hibernate---Session 會話
package com.itheima.b_api;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;
import com.itheima.a_hello.User;
//詳解Session物件
public class session_test {
@Test
//Session物件 用於操作資料庫
//增
public void fun1(){
//1載入配置
Configuration conf = new Configuration().configure();
//2 根據Configuration 配置資訊建立 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 獲得session
Session session = sf.openSession();
User u = new User();
u.setName("jerry");
u.setPassword("1234");
//呼叫Session的save方法儲存物件到資料庫中
session.save(u);
//關閉資源
session.close();
sf.close();
}
@Test
//Session物件 用於操作資料庫
//改
public void fun2(){
//1載入配置
Configuration conf = new Configuration().configure();
//2 根據Configuration 配置資訊建立 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 獲得session
Session session = sf.openSession();
//開啟事務
Transaction ts = session.beginTransaction();
//先查詢出你要修改的物件
User user = (User) session.get(User.class,1);
//在查詢結果上,進行修改
user.setName("湯姆");
session.update(user);
//提交事務
ts.commit();
//關閉資源
session.close();
sf.close();
}
@Test
//Session物件 用於操作資料庫
//刪
public void fun3(){
//1載入配置
Configuration conf = new Configuration().configure();
//2 根據Configuration 配置資訊建立 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 獲得session
Session session = sf.openSession();
//開啟事務
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//先查詢出你要修改的物件
User user = (User) session.get(User.class,2);
/*User user = new User();
user.setId(1);*/
//根據ID刪除
session.delete(user);
//---------------------------------------------------------
//提交事務
ts.commit();
//關閉資源
session.close();
sf.close();
}
@Test
//Session物件 用於操作資料庫
//查詢用get
public void fun4(){
//1載入配置
Configuration conf = new Configuration().configure();
//2 根據Configuration 配置資訊建立 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 獲得session
Session session = sf.openSession();
//開啟事務
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//查詢
User user = (User) session.get(User.class,3);
//---------------------------------------------------------
//提交事務
ts.commit();
//關閉資源
session.close();
sf.close();
System.out.println(user);
}
@Test
//Session物件 用於操作資料庫
//查詢用 load
public void fun5(){
//1載入配置
Configuration conf = new Configuration().configure();
//2 根據Configuration 配置資訊建立 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 獲得session
Session session = sf.openSession();
//開啟事務
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
User user = (User) session.load(User.class,3);
//---------------------------------------------------------
//提交事務
ts.commit();
//關閉資源
session.close();
sf.close();
System.out.println(user);
}
//get: get方法被呼叫時立刻 傳送sql語句查詢
//load : 呼叫時並沒有查詢資料庫,當我們需要使用該物件的時候,才查詢資料。 load方法 ------ 使用代理技術,建立一個代理物件(屬性只有ID) ------返回代理物件------使用代理物件屬性-----呼叫Hibernate,查詢資料庫
//------------------------------------------------------------------------------------------------------------
@Test
//Session物件 用於操作資料庫
//查詢所有User 用createQuery("hql")
public void fun6(){
//1載入配置
Configuration conf = new Configuration().configure();
//2 根據Configuration 配置資訊建立 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 獲得session
Session session = sf.openSession();
//開啟事務
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//HQL語言 => Hibernate Query Language
//createQuery 傳入hql語句查詢
//select * from t_user;
Query query = session.createQuery("from com.itheima.a_hello.User"); // from 完整類名
//list 將語句執行,並返回結果
List<User> list = query.list();
System.out.println(list);
//---------------------------------------------------------
//提交事務
ts.commit();
//關閉資源
session.close();
sf.close();
}
@Test
//Session物件 用於操作資料庫
//查詢所有User 用createCriteria(Class)
public void fun7(){
//1載入配置
Configuration conf = new Configuration().configure();
//2 根據Configuration 配置資訊建立 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 獲得session
Session session = sf.openSession();
//開啟事務
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//Criteria 查詢 => Hibernate獨創的面向物件的查詢 => 無語句
Criteria criteria = session.createCriteria(User.class);
//select * from t_user;
List<User> list = criteria.list();
System.out.println(list);
//---------------------------------------------------------
//提交事務
ts.commit();
//關閉資源
session.close();
sf.close();
}
@Test
//Session物件 用於操作資料庫
//查詢所有User
public void fun8(){
//1載入配置
Configuration conf = new Configuration().configure();
//2 根據Configuration 配置資訊建立 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 獲得session
Session session = sf.openSession();
//開啟事務
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//原生的Sql查詢
SQLQuery query = session.createSQLQuery("select * from t_user");
// addEntity 將查詢結果封裝到指定物件中
query.addEntity(User.class);
List<User> list = query.list();
System.out.println(list);
/*List<Object[]> list = query.list();
for(Object[] objs : list){
System.out.println(Arrays.toString(objs));
}*/
//---------------------------------------------------------
//提交事務
ts.commit();
//關閉資源
session.close();
sf.close();
}
//---------------------------------------------------------------------------
/*
* session.save();
* session.update();
* session.delete();
* session.get();
* session.load(); 對比get
* session.createQuery()
* session.createCritieria();
* session.createSqlQuery();
*
*/
//-------------------------------------------------------------------
//1. load方法.返回一個代理物件,獲得其內容時,會查詢資料庫,是每次訪問屬性都會查詢資料庫嗎?
//答:不是每次都查.代理物件中有一個標識是否被初始化的boolean型變數. 記錄是否被初始化過.
//2 . 代理都是要基於介面的,用load方法返回的代理,就沒有實現任何介面?
//答: java中的動態代理是基於介面. 而 Hibernate 是使用javassist-3.12.0.GA.jar 產生代理物件的.
// 該代理與被代理物件之間的關係是繼承關係. 與我們學的動態代理不是一種. 所以不需要介面.
}