zoukankan      html  css  js  c++  java
  • 框架 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控制台

  • 相关阅读:
    JAVA编写的一个简单的Socket实现的HTTP响应服务器
    IPTV 质量评价方法已经不适用于 OTT TV 质量评价
    AAC规格(LC,HE,HEv2)及性能对比
    洛谷 P1572 计算分数
    洛谷 P2128 赤壁之战
    洛谷 P2818 天使的起誓
    洛谷 P3914 染色计数
    洛谷 P1193 洛谷团队训练VS传统团队训练
    洛谷 P1318 积水面积
    洛谷 P1061 Jam的计数法
  • 原文地址:https://www.cnblogs.com/hanruyue/p/6046569.html
Copyright © 2011-2022 走看看