1. 程式人生 > >Hibernate---Session 會話

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 產生代理物件的.
        // 該代理與被代理物件之間的關係是繼承關係.   與我們學的動態代理不是一種.     所以不需要介面.
}