框架 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_user

 

test6方法控制台

 

 

 

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 > 5

不要有t.rowid,这是删除数据用的

 

 

数据库中的表

 

 test7方法控制台

 

 

test77控制台

 

 

posted @ 2016-11-09 13:12  hanruyue  阅读(879)  评论(0编辑  收藏  举报