框架 hibernate3 多條查詢 分頁

 

 

package com.hanqi.test;

import java.util.Date;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.hanqi.entity.User;

public class Test01 {
    
    private Session se=null;
    private SessionFactory sf=null;
    private Transaction ts=null;
    //定義特殊方法
    //在測試用例方法被執行以前自動執行的方法
    //通常用來初始化公用的對象
    //前置方法
    @Before
    public void init()
    {
        //1獲取配置文件
        Configuration cfg=new Configuration().configure();
        //2註冊配置
        ServiceRegistry sr=new StandardServiceRegistryBuilder()
            .applySettings(cfg.getProperties()).build();
        //3獲取SessionFactory  (至關於jdbc的鏈接connection) 
        sf=cfg.buildSessionFactory(sr);
        System.out.println(sf);
                    
        //4產生Session 保存    跟jsp session不要緊     叫會話而已  真正幹活的
         se=sf.openSession();
                    
        //5啓動事務
         ts=se.beginTransaction();
    }
    
    //後置方法
    //通常用來釋放資源
    @After
    public void destory()
    {
        //7提交事務
        ts.commit();//提交事務,否則沒有真正的放到數據庫  在這裏執行了insert語句才寫進數據庫
                
        //8釋放資源
        se.close();
        sf.close();
    }
    
    
    
    
    //測試Hibernate鏈接
    
    @Test
    public void test() {
    
        //6操做數據庫
        //添加數據
        
        //實例化新對象,處於臨時狀態
        User u1=new User();
        u1.setBirthday(new Date());//建立當地時間
        u1.setMoney(2000);
        u1.setPassword("123456");
        u1.setUserName("測試1");
        //u1.setUserID(2);//天然主鍵
        
        //保存數據
        //經過save方法把對象從臨時狀態轉成持久化狀態
        se.save(u1);//不用操心insert語句,但不在這執行語句,也會有主鍵,hibernate自動生成
        System.out.println(u1);
        
        
    }
    
    //測試查詢
    @Test
    public void test1()
    {
        //查詢數據   查一個
        //提供2個參數
        //須要返回哪個持久化類的實例
        //實例的標識(數據的主鍵值)
        //經過session的get方法得到的對象處於持久化狀態
        User u2=(User)se.get(User.class,5);//User類  主鍵是3
        System.out.println(u2);
        
        
        //修改數據
        User u3=(User)se.get(User.class,10);//User類  主鍵是3
        u3.setUserName("修改");
        System.out.println(u3);
        
        //刪除
        //se.delete(u2);//使持久化對象進入刪除狀態
        
    }
    
    @Test
    public void test2()
    {
        User u1=(User)se.get(User.class,5);//當即加載數據
        System.out.println("get後");
        System.out.println("u1="+u1);
        User u2=(User)se.get(User.class,6);
        System.out.println("u2="+u2);
    }
    
    public void test3()
    {
        User u1=(User)se.load(User.class,6 );//延時加載數據
        System.out.println("load後");
        System.out.println("U1="+u1);//當要使用時才能加載
    }
    
    //測試遊離狀態
    @Test
    public void test4()
    {
        //獲得持久化狀態的對象
        User u1=(User)se.get(User.class, 6);
        System.out.println("u1="+u1);
        se.close();//關閉遊離狀態
        
        //使u1進入遊離狀態
        u1.setUserName("測試遊離456");
        //把OID置成null
        u1.setUserID(null);//把實體類的類型改成Integer  
        System.out.println("從新建立Session和事務...");
        
        //從新建立Session,再使session回來
        se=sf.openSession();
        //從新開啓事務        事務se.close()以前已經關了
        ts=se.beginTransaction();
        
        se.saveOrUpdate(u1);//自動判斷是save仍是update 爲空是添加,有的話修改
    }
    
    //測試HQL
    @SuppressWarnings("unchecked")
    @Test
    public void test5()//Ouery是個查詢類,要建立
    {
        
        //使用HQL   這是面向對象的,必定要注意大小寫
        //建立Query對象
//        Query qu=se.createQuery("from User u where u.userID >? and u.userName=:uname order by userID");
        //user是類名,寫類名,針對實體類的   屬性  構造方法按規則減小麻煩
        
        
        //設置佔位符
//        qu.setInteger(0,20);//?的以前sql是從1開始,而這裏是從0開始
        
        //按參數名方式設置
//        qu.setString("uname","測試1");
        
        //執行查詢
        List<User> lu;//=qu.list();//獲得結果集
        
        //方法鏈調用
        //都返回Query qu來取得結果集  前面也是不用寫
        lu=se.createQuery("from User where userID>?")
                .setInteger(0,100)//setInteger結果有返回值,返回它本身
                .list();
        
        for(User u:lu)
        {
            System.out.println(u);
        }
    }
    
    //Query qu=se.createQuery("from User where u.userID <100 and username like '測試1' order by userID desc");
    //Query qu=se.createQuery("from User where userID >100 order by userID");
    //java8   lu=上面的,加上.scream().formatch()
    
    
    @Test
    @SuppressWarnings("unchecked")
    public void test6()
    {
        List<User> lu=se.createQuery("from User order by userID")
                .setMaxResults(5)//默認從0行開始,不用寫第幾行開始
                .list();
        for(User u:lu)
        {
            System.out.println(u);
        }
    }
    
    
    @Test
    @SuppressWarnings("unchecked")
    public void test66()
    {
        //設置開始行號 :頁碼=2
        //開始行數=(頁碼減一 )*每頁行數
        List<User> lu=se.createQuery("from User order by userID")
                .setMaxResults(5)//默認從0行開始,不用寫第幾行開始
                .setFirstResult(5)//(2-1)*5
                .list();
        for(User u:lu)
        {
            System.out.println(u);
        }
    }
    
    @SuppressWarnings("unchecked")
    @Test
    public void test7()
    {
        //分組查詢      單列
        //由於group by在數據庫中select只能返回username,不能查全部,因此返回任意類型不是單個的object[]
        //from 開頭表示select *  不行因此加select
        //單個例不必數組
        List<Object> lo=se.createQuery("select userName from User group by userName")
                        .list();
        //輸出長度
        //System.out.println("數據條數="+lo.size());
        for(Object o:lo)
        {
            System.out.println(o);
        }
    }
    @SuppressWarnings("unchecked")
    @Test
    public void test77()
    {
        //分組查詢      多列
        //由於group by在數據庫中select只能返回username,不能查全部,因此返回任意類型不是單個的object[]
        //from 開頭表示select *  不行因此加select
        //單列不必數組
        List<Object[]> lo=se.createQuery("select userName,count(1) from User group by userName")
                        .list();
        //輸出長度
        //System.out.println("數據條數="+lo.size());
        for(Object[] o:lo)
        {
            System.out.println(o[0]+""+o[1]);
        }
    }
}

 

數據庫的表t_userjava

 

test6方法控制檯sql

 

 

 

test66方法的控制檯顯示數據庫

 

 

oracle的分頁寫法,效率最高的數組

select * from (select a.*, rownum as r from (select t.* from T_USER t order by userid) a
where rownum <=10)where r > 5session

不要有t.rowid,這是刪除數據用的oracle

 

 

數據庫中的表app

 

 test7方法控制檯jsp

 

 

test77控制檯測試

 

相關文章
相關標籤/搜索