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控制台